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()方法省略 }
对象关系映射文件Team.hbm.xml:(并将其加入到hibernate.cfg.xml主配置文件中<mapping resource="Team.hbm.xml"/>)
<?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); tx.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一对多双向关联。
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8684543