现在的位置: 首页 > 综合 > 正文

Hibernate映射Set

2018年02月04日 ⁄ 综合 ⁄ 共 2515字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.