Hibernate映射Set,其中Set集合中可以放我们自定义的类,也可以是像String、Long、Date等能够直接映射到数据库表字段上的类型,后者相对来说比较简单。
以Team类为例:
- package bean;
- import java.util.Set;
- public class Team {
- private long id;
- private String name;
- private Set<String> students;//Set内存放学生的姓名
- //setXxx()、getXxx()方法省略
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="bean.Team" table="team">
- <id name="id" column="id" type="long">
- <generator class="increment"></generator>
- </id>
- <property name="name" column="name" type="string"></property>
- <set name="students" table="students"><!-- 将Set内的内容存放在students表中 -->
- <key column="team_id"></key><!-- students表中的主键,同时也是参考team表主键id的外键 -->
- <element column="student_name" type="string"></element>
- </set>
- </class>
- </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对象:
- tx=session.beginTransaction();
- Team t1=new Team();
- t1.setName("team1");
- t1.setStudents(new HashSet<String>());
- t1.getStudents().add("student1-1");
- t1.getStudents().add("student1-2");
- t1.getStudents().add("student1-3");
- Team t2=new Team();
- t2.setName("team2");
- t2.setStudents(new HashSet<String>());
- t2.getStudents().add("student2-1");
- t2.getStudents().add("student2-2");
- t2.getStudents().add("student2-3");
- session.save(t1);
- session.save(t2);
- commit();
控制台输出的SQL语句为:
- Hibernate: select max(id) from team
- Hibernate: insert into team (name, id) values (?, ?)
- Hibernate: insert into team (name, id) values (?, ?)
- Hibernate: insert into students (team_id, student_name) values (?, ?)
- Hibernate: insert into students (team_id, student_name) values (?, ?)
- Hibernate: insert into students (team_id, student_name) values (?, ?)
- Hibernate: insert into students (team_id, student_name) values (?, ?)
- Hibernate: insert into students (team_id, student_name) values (?, ?)
- Hibernate: insert into students (team_id, student_name) values (?, ?)
删除Team对象:
- Team t=(Team)session.get(Team.class, 1L);
- session.delete(t);
即使Team.hbm.xml中的<set>属性值为cascade="save-update"不具备delete的级别,但是依旧能将students表中对应的记录删除而不是将某些字段设为NULL。
控制台输出的SQL语句为:
- Hibernate: select team0_.id as id0_0_, team0_.name as name0_0_ from team team0_ where team0_.id=?
- Hibernate: delete from students where team_id=?
- Hibernate: delete from team where id=?
至于较为复杂的情况即Hibernate映射Set,Set中存放元素的是我们自定义的类对象这种情况,可以参考 Hibernate一对多双向关联