hibernate映射中inverse属性的使用
来源:互联网 发布:java开发库存管理系统 编辑:程序博客网 时间:2024/06/03 11:15
inverse常用于一对多双向关联关系中。以Student(学生)和Class(班级)为例,它们之间的关系为一对多的关系,即一个学生只能属于一个班级,一个班级可以包含多个学生。学生类定义代码:Class Student{ private int id; private String name; private Class class; //省略getter()和setter()方法}班级类定义代码:Class Class{ private int id; private String name; private Set students = new HashSet(); //省略getter()和setter()方法}Student类的映射文件:<class name="Student" table="STUDENT"> <id name="id" type="int" column="ID"> <generator class="native" /> </id> <property name="name" type="string" column="NAME" /> <many-to-one name="class" column="CLASS_ID" class="Class" cascade="save-update" /> </class>Class类的映射文件:<class name="Class" table="CLASS"> <id name="id" type="int" column="ID"> <generator class="native" /> </id> <property name="name" type="string" column="NAME" /> <set name="students" table="STUDENT" cascade="save-update" inverse="false"> <key column="CLASS_ID" /> <one-to-many class="Student" /> </set></class>STUDENT表中存在一个名为CLASS_ID的字段,它和CLASS表中的ID字段是主外键关系。那个inverse属性就是用来规定是由谁(Student或Class)来维护这个主外键关系的。(Class映射中<set>中设为false为Class维护,反之为Student维护)。
如下代码为例:Class c1 = new Class();c1.setName("一班");Student s1 = new Student();Student s2 = new Student();s1.setName("Jason");s2.setName("Tom");c1.getStudents().add(s1);c2.getStudents().add(s2);s1.setClass(c1);s2.setClass(c1); //注释1session.save(c1);上面的代码会使Hibernate执行五条SQL语句,其中前三条是insert插入语句,后两条是update更新语句。插入就不用说了,那么为什么还要有更新语句呢?
这是因为Class类映射文件的<set>元素中指定了inverse="false",这就告之Hibernate:STUDENT表与CLASS表的主外键关系是由Class类来维护的。当执行save时,执行了三条insert语句,这三条语句中的后两条是插入到STUDENT的CLASS_ID字段是通过s1.getClass().getID()取出的。为了保证主外键关系,Hibernate在这种情况下会从c1对象中直接取得CLASS_ID字段再执行两条update语句来更改STUDENT表中两个新插入记录的CLASS_ID字段。(即最终值来自class类)。如果我们将Class类映射文件的<set>元素中的inverse属性修改为true,这就是告诉Hibernate:Class类不维护主外键关系了,这个任务就交给了Student类。于是,我们再执行上面的代码,Hibernate就会只执行三条insert语句,而不会执行任何update语句。因为Hibernate会通过Student类的s1.getClass().getID()和s2.getClass().getID()来确定CLASS_ID字段的值。(即最终值来自studnet类)。
故而再删除时,如果父表对应的entity类inverse为false(即默认值),再删除时,执行完主表的delete语句后,其外键字段会被置为null,产生脏数据。
故而。一般在在一对多双向关联关系中,将一方的inverse属性设置为true,即将主外键的关系交由多方来维护。
0 0
- hibernate映射中inverse属性的使用
- hibernate 映射文件 inverse 属性
- Hibernate中inverse的使用
- Hibernate 中 元素的inverse 属性分析
- Hibernate中inverse属性的应用
- 在 Hibernate 中inverse的属性
- Hibernate中集合映射的两个属性:cascade和inverse
- Hibernate 一对多映射: inverse属性的作用
- 【Hibernate】的Inverse属性
- Hibernate-映射 &inverse的探讨
- hibernate中cascade和inverse的使用
- Hibernate中cascade和inverse的使用
- hibernate中inverse=true的使用
- hibernate中cascade和inverse的使用
- Hibernate inverse的属性介绍
- Hibernate中inverse属性与cascade属性
- Hibernate中inverse属性与cascade属性
- Hibernate中inverse属性与cascade属性
- 编程行业里面的新行话
- java实现组播通信
- 第三周:验证判断
- 如何比较本地应用和Web应用
- C语言面试宝典题目分析(三)
- hibernate映射中inverse属性的使用
- 小心使用Asp:TextBox的ReadOnly属性
- 类中的奥秘
- 2014上半年计划
- Hibernate旅程(三)Hibernate持久化对象的三个状态
- 查看ubuntu的版本号
- UILocalNotification 本地通知的用法
- flex 线形图为虚线,绘制图例(1)
- UPCC hello