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.youkuaiyun.com/jialinqiang/article/details/8684543