Hibernate映射Set

Hibernate映射Set,其中Set集合中可以放我们自定义的类,也可以是像String、Long、Date等能够直接映射到数据库表字段上的类型,后者相对来说比较简单。

以Team类为例:

  1. package bean;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Team {  
  6.     private long id;  
  7.     private String name;  
  8.     private Set<String> students;//Set内存放学生的姓名  
  9.   //setXxx()、getXxx()方法省略  
  10. }  
对象关系映射文件Team.hbm.xml:(并将其加入到hibernate.cfg.xml主配置文件中<mapping resource="Team.hbm.xml"/>)
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4.   
  5. <hibernate-mapping>  
  6.     <class name="bean.Team" table="team">  
  7.         <id name="id" column="id" type="long">  
  8.             <generator class="increment"></generator>  
  9.         </id>  
  10.         <property name="name" column="name" type="string"></property>  
  11.         <set name="students" table="students"><!-- 将Set内的内容存放在students表中 -->  
  12.            <key column="team_id"></key><!-- students表中的主键,同时也是参考team表主键id的外键 -->  
  13.            <element column="student_name" type="string"></element>  
  14.         </set>  
  15.     </class>  
  16. </hibernate-mapping>  
说明:

(1)hibernate在映射Set时也会像映射Map那样,在另外的表如students中存放Set的内容,并且会在students表中设置一个参照Team表主键id的外键(如team_id)。

(2)students表中有两个字段team_id和student_name,主键为team_id(因为Set中的元素时不重复的)而不是像映射Map<Long,String>那样需要组合主键。

保存Team对象:

  1. tx=session.beginTransaction();  
  2. Team t1=new Team();  
  3. t1.setName("team1");  
  4. t1.setStudents(new HashSet<String>());  
  5. t1.getStudents().add("student1-1");  
  6. t1.getStudents().add("student1-2");  
  7. t1.getStudents().add("student1-3");  
  8. Team t2=new Team();  
  9. t2.setName("team2");  
  10. t2.setStudents(new HashSet<String>());  
  11. t2.getStudents().add("student2-1");  
  12. t2.getStudents().add("student2-2");  
  13. t2.getStudents().add("student2-3");  
  14.   
  15. session.save(t1);  
  16. session.save(t2);  
  17. commit();  

控制台输出的SQL语句为:
  1. Hibernate: select max(id) from team  
  2. Hibernate: insert into team (name, id) values (?, ?)  
  3. Hibernate: insert into team (name, id) values (?, ?)  
  4. Hibernate: insert into students (team_id, student_name) values (?, ?)  
  5. Hibernate: insert into students (team_id, student_name) values (?, ?)  
  6. Hibernate: insert into students (team_id, student_name) values (?, ?)  
  7. Hibernate: insert into students (team_id, student_name) values (?, ?)  
  8. Hibernate: insert into students (team_id, student_name) values (?, ?)  
  9. Hibernate: insert into students (team_id, student_name) values (?, ?)  
表的内容为:

删除Team对象:

  1. Team t=(Team)session.get(Team.class, 1L);  
  2.           session.delete(t);  

即使Team.hbm.xml中的<set>属性值为cascade="save-update"不具备delete的级别,但是依旧能将students表中对应的记录删除而不是将某些字段设为NULL。

控制台输出的SQL语句为:

  1. Hibernate: select team0_.id as id0_0_, team0_.name as name0_0_ from team team0_ where team0_.id=?  
  2. Hibernate: delete from students where team_id=?  
  3. Hibernate: delete from team where id=?  

至于较为复杂的情况即Hibernate映射Set,Set中存放元素的是我们自定义的类对象这种情况,可以参考 Hibernate一对多双向关联
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值