Hibernate 关联映射 之多对一关联(一)

来源:互联网 发布:马里亚纳网络战争七区 编辑:程序博客网 时间:2024/06/06 02:45

1、Hibernate关联映射的目标:

   1) 将内存中的关联信息,存储到数据库

   2)从数据库中取出数据,并在内存中重建关联

2、关联关系要弄清,首先学会建模:若多对一单项关联:

     看下图:首先看箭头的指向,说明是多对一,另外group是ContactPerson里面关联的对象,所以不会出现在ContactPerson属性图里面。

图:

根据图代码示例如下:

public class ContactPerson {private int id;private String name;private String qq;private Group group;ContactPerson(){}public ContactPerson(String name) {this.name = name;}public int getId() {return id;}
public class Group {private int id;private String name;Group() {}public Group(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}
<hibernate-mapping><class name="com.shangxuetang.ContactPerson" table="contactPerson"><id name="id"><generator class="native"/></id><property name="name"></property><property name="qq"></property><many-to-one name="group" column="gid"/></class></hibernate-mapping>
<hibernate-mapping><class name="com.shangxuetang.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"></property></class></hibernate-mapping>


测试代码:

public void  testManyToOne() {Session session = HibernateUtil.getSession();try {session.beginTransaction();ContactPerson cp1 = new ContactPerson("a");ContactPerson cp2 = new ContactPerson("b");ContactPerson cp3 = new ContactPerson("c");session.save(cp1);session.save(cp2);session.save(cp3); Group g1 = new Group("family"); Group g2 = new Group("friend");  session.save(g1); session.save(g2);  cp1.setGroup(g1); cp2.setGroup(g2); session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {session.close();}}

执行之后数据库的值为:


 

3、2中的测试示例代码与之下的测试示例代码,性能不好,因为前者执行之后,会多发出三条update语句。

    语句7、8、9、10 移到语句123456之前,语句11、12移到语句4、5、6之前。

public void  testManyToOne() {Session session = HibernateUtil.getSession();try {session.beginTransaction(); Group g1 = new Group("family");//语句7 Group g2 = new Group("friend");//语句8  session.save(g1);//语句9 session.save(g2);//语句10 ContactPerson cp1 = new ContactPerson("a");//语句1ContactPerson cp2 = new ContactPerson("b");//语句2ContactPerson cp3 = new ContactPerson("c");//语句3cp1.setGroup(g1);//语句11cp2.setGroup(g2);//语句12session.save(cp1);//语句4session.save(cp2);//语句5session.save(cp3);//语句6session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {session.close();}}

这是hibernate性能优化的措施:多对一关联,一般先有“一”,然后再有“多”,从“多”一端,建立和“一”之间的关联。
 


 


 

原创粉丝点击