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

来源:互联网 发布:遗传算法交叉变异概率 编辑:程序博客网 时间:2024/05/20 11:49

1、联系人和用户组 之间的一对多的单项关联:

联系人示例代码:

<hibernate-mapping><class name="com.shangxuetang.ContactPerson" table="contactPerson"><id name="id"><generator class="native"/></id><property name="name"></property><property name="qq"></property></class></hibernate-mapping>
public class ContactPerson {private int id;private String name;private String qq;ContactPerson(){}public ContactPerson(String name) {this.name = name;}


用户组示例代码:

public class Group {private int id;private String name;private Set<ContactPerson> cps;Group() {}public Group(String name) {this.name = name;}
<hibernate-mapping><class name="com.shangxuetang.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"></property><set name="cps">   <key column="gid"></key>   <one-to-many class="com.shangxuetang.ContactPerson"/></set></class></hibernate-mapping>


测试用例代码:

public void  testOnetoMany() {Session session = HibernateUtil.getSession();//语句20try {session.beginTransaction();ContactPerson cp1 = new ContactPerson("zhangsan");//语句1ContactPerson cp2 = new ContactPerson("LISI");//语句2ContactPerson cp3 = new ContactPerson("WANGWU");//语句3session.save(cp1);//语句4session.save(cp2);//语句5session.save(cp3);//语句6Group g1 = new Group("family");//语句7Group g2 = new Group("friend");//语句8Group g3 = new Group("dog");//语句9Set<ContactPerson> persons1 = new HashSet<ContactPerson>();//语句10persons1.add(cp1);//语句11persons1.add(cp2);//语句12g1.setCps(persons1);//语句13Set<ContactPerson> persons2 = new HashSet<ContactPerson>();//语句14persons2.add(cp3);//语句15g2.setCps(persons2);//语句16session.save(g1);//语句17session.save(g2);//语句18session.save(g3);//语句19session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {session.close();}}

2、测试用例代码在执行完语句20之后,会把联系人和用户组的表创建好,同时也会把表中的关联关系创建好。如下图联系人用户表:

 

3、测试用例代码在执行完语句4后会发出insert语句,但不会把数据同步到数据库,直到执行session.getTransaction().commit()事务提交。

4、测试用例代码 语句10 到语句 16 代码不简洁,可以采用GRASP的专家模式进行优化。(专家模式讲究的是一个职责分配)

    示例代码如下:

public class Group {private int id;private String name;private Set<ContactPerson> cps;Group() {}public Group(String name) {this.name = name;}public void addCPS(ContactPerson cp) {if(cps != null) {cps = new HashSet<ContactPerson>();}cps.add(cp);}

测试示例代码可以修改为:

public void  testOnetoMany() {Session session = HibernateUtil.getSession();//语句20try {session.beginTransaction();ContactPerson cp1 = new ContactPerson("zhangsan");//语句1ContactPerson cp2 = new ContactPerson("LISI");//语句2ContactPerson cp3 = new ContactPerson("WANGWU");//语句3session.save(cp1);//语句4session.save(cp2);//语句5session.save(cp3);//语句6Group g1 = new Group("family");//语句7Group g2 = new Group("friend");//语句8Group g3 = new Group("dog");//语句9//Set<ContactPerson> persons1 = new HashSet<ContactPerson>();//语句10//persons1.add(cp1);//语句11//persons1.add(cp2);//语句12//g1.setCps(persons1);//语句13////Set<ContactPerson> persons2 = new HashSet<ContactPerson>();//语句14//persons2.add(cp3);//语句15//g2.setCps(persons2);//语句16g1.addCPS(cp1);g1.addCPS(cp2);g2.addCPS(cp3);session.save(g1);//语句17session.save(g2);//语句18session.save(g3);//语句19session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {session.close();}}


 

 

原创粉丝点击