Hibernate映射Bag
来源:互联网 发布:狸窝 mac 编辑:程序博客网 时间:2024/06/08 09:51
Bag(结合了List与Set),可以重复且没有顺序的一种集合,是Hibernate提供的。HIbernate使用jdk的List模拟Bag。其配置与Hibernate映射List时基本相同。
以Team、Student为例:
持久化类Team(与映射List<Student>时相同):
package bean;import java.util.List;public class Team {private long id;private String name;private List<Student> students; //省略get、set方法}
持久化类Student(与映射List<Student>时相同):
package bean;public class Student {private long id;private long cardID;private String name;private int age;private Team team; //省略get、set方法}
对象关系映射文件Team.hbm.xml:
<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><bag name="students" cascade="all" table="students"><key column="team_id"></key> <one-to-many class="bean.Student"/> </bag></class></hibernate-mapping>
Student.hbm.xml(与映射List<Student>时相同):
<hibernate-mapping><class name="bean.Student" table="students"><id name="id" column="id" type="long"><generator class="increment"></generator></id><property name="name" column="name" type="string"></property><property name="age" column="age" type="int"></property><property name="cardID" column="cardID" type="long"></property> <many-to-one name="team" class="bean.Team" column="team_id" cascade="none"></many-to-one></class></hibernate-mapping>
并将它们加入到主配置文件中:
<mapping resource="Team.hbm.xml"/> <mapping resource="Student.hbm.xml"/>说明:
Hibernate依然将Team的List中的元素放置到另一张表中(此处即students表),与映射List不同的是<bag>中不需要指定index索引(因为Bag中的元素是可重复并且无续的),team表和students表结构如下:
级联保存Team对象:
tx=session.beginTransaction(); Team t1=new Team(); t1.setName("team1"); t1.setStudents(new ArrayList<Student>()); t1.getStudents().add(new Student(1001L,23,"zhangsan")); t1.getStudents().add(new Student(1002L,23,"lisi")); t1.getStudents().add(new Student(1001L,23,"zhangsan")); session.save(t1); tx.commit();此时输出的SQL语句为:
Hibernate: select max(id) from teamHibernate: select max(id) from studentsHibernate: insert into team (name, id) values (?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)Hibernate: update students set team_id=? where id=?Hibernate: update students set team_id=? where id=?Hibernate: update students set team_id=? where id=?可以看出执行流程是先取一个默认值(实际为NULL)给team_id向students表中插入一条记录,然后再执行update语句更新students表中的对应记录的team_id字段值。
若将Team.hbm.xml中<bag>元素的inverse属性值改为true:
<bag name="students" cascade="save-update" table="students" inverse="true"><!--指定由students表维持两表之间的关联关系-->然后再执行上述保存Team对象的语句,此时输出的SQL语句为:
Hibernate: select max(id) from teamHibernate: select max(id) from studentsHibernate: insert into team (name, id) values (?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)对比可知,并没有执行上述的update语句,原因就在于是students表维持两表之间的关联关系而不再是Team表,通过对比以下students表中的前三条记录和后三条记录就可以理解inverse的作用,并且Bag存放的元素是可以重复及无续的:
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8688481
- Hibernate映射Bag
- Hibernate集合映射之Bag
- Hibernate学习笔记:集合映射之映射Set, Bag
- Hibernate之映射值类型集合(映射bag)
- 【Hibernate】Hibernate的集合映射(Set、List、Array、Map、Bag)
- 关于Hibernate集合映射中 bag 的说明
- Hibernate常见集合映射(Set,List Array,Map,Bag)
- hibernate 映射集合(Set,List Array,Map,Bag)
- Hibernate的集合映射(Set、List、Array、Map、Bag)
- Hibernate 之List ,Bag,Map三种映射文件详解
- Hibernate的集合映射(Set、List、Array、Map、Bag)
- Hibernate常见的集合映射 Set,List,Array,Map,Bag
- Hibernate的集合映射(Set、List、Array、Map、Bag)
- Hibernate映射集合属性2__List、Map、数组、Bag等
- Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)
- Hibernate之映射集合(值类型的set,bag,idbag,list和map)
- Hibernate高级实体关联映射之多值的实体关联(一对多关联,使用bag)
- Hibernate常见的集合映射主要有Set,List,Array,Map,Bag
- Android 之ActivityThead、ActivityManagerService 与activity的管理和创建
- 大白菜装XP
- php生成二维码
- Linux搭建安卓开发环境
- 父类引用指向子类对象(Java中的多态)
- Hibernate映射Bag
- FTP保持连接
- ORACLE 恢复删除记录
- 使用GDAL对DEM进行彩色渲染
- 几个 JavaScript Questions
- C++ 中使用boost::property_tree读取解析ini文件
- DB2通讯连接设置
- Ubuntu 11.10 打开 windows文件乱码解决方法
- 学习笔记------写下以备后来查阅