hibernate用了好久了,却还是一知半解,对很多概念都不是很清楚,今天又碰到了inverse的问题,总不能一次一次的应付下去,查了好久资料,终于对这个概念有了自己的理解,记笔记如下。
inverse只能出现在hibernate中的一对多one-to-many和多对多many-to-many中,他表示了由哪一方来维护双方的关系,其实在many-to-one中也有这个inverse,只不过该值是false,且不能更改而已。inverse=true表示由对方来维护关系,而inverse=false表示由自己来维护关系,下面解释一下维护关系的概念。为了简单起见,在这儿配置没有使用级联设置。
假设有两张表parent和child,parent和child是一对多的关系,一个parent可以有多个child,而多个child可以属于一个parent,假设XML配置如下:
<class name="Parent" table="parent">
...
<set name="children" table="child" lazy="true" cascade="none" inverse="true">
<key column="parentID"></key>
<one-to-many class="Child"/>
</set>
</class>
<class name="Child" table="child">
...
<many-to-one name="parent" class="one2many.Parent" cascade="none">
<column name="parentID"/>
</many-to-one>
</class>
在parent的child中的inverse=true,这就表示由child来维护关系,也就是说在保存parent时候,是不会去维护与child的关系,而只有在保存child实体的时候才会把关系写入到数据库中。以下用例子说明:
1.inverse=true,代码如下:
Parent parent = new Parent();
Child child = new Child();
parent.getChildren().add(child);
child.setParent(parent);//如果没有这一句,会插入两条记录,但是child的parentID字段为空值
session.save(parent);
session.save(child);//在此处会保存关系
session.flush();
以下代码会生成SQL如下:
Hibernate: insert into parent (name, ID) values (?, ?)
Hibernate: insert into child (name, parentID, ID) values (?, ?, ?)
2.inverse=false,代码如下:
清单2.1
Parent parent = new Parent();
Child child = new Child();
parent.getChildren().add(child);
child.setParent(parent);//注释一
session.save(parent);
session.save(child);//在此处会保存关系
session.flush();
生成的SQL如下:
Hibernate: insert into parent (name, ID) values (?, ?)
Hibernate: insert into child (name, parentID, ID) values (?, ?, ?)
Hibernate: update child set parentID=? where ID=?
如果我们把注释一处的内容去掉或者注释,即代码如下:
清单2.2
Parent parent = new Parent();
Child child = new Child();
parent.getChildren().add(child);
//child.setParent(parent);//注释一
session.save(parent);
session.save(child);//在此处会保存关系
session.flush();
此时生成的SQL如下:
Hibernate: insert into parent (name, ID) values (?, ?)
Hibernate: insert into child (name, parentID, ID) values (?, ?, ?)
Hibernate: update child set parentID=? where ID=?
此时好像看起来生成的代码是一样的,而且结果也是一样的,但实际上在第一处的时候生成插入child的时候,parentID是有值的,但是在注释掉后插入child的时候,parentID的值是null,如果在数据库中有外键约束的时候肯定会出错。清单2.1中生成的SQL和inverse=true进行比较,发现多了一条update语句,这个update是由parent创建的,因为parent也负责管理关系,这样导致多了一次操作。清单2.2中的代码在插入child的时候,首先会给parentID赋空值,然后再由parent负责更新child的parentID字段。
以上就是个人对inverse的简单理解,如果有什么不对的地方,欢迎大家指正。
分享到:
相关推荐
cascade 和inverse是Hibernate中较为难理解的两个属性,此资料详细地介绍了这两个属性的用法。
于Hibernate中 cascade 与 inverse 的理解。 您买的Hibernate书是哪一本呢? 孙卫琴的精通Hibernate,还是 深入浅出Hibernate还是那本。。。 我是两本都买了,总体来说还可以,但是,有的地方讲的比较书面化,比如...
8.2 理解Session的缓存 8.2.1 Session的缓存的作用 8.2.2 脏检查及清理缓存的机制 8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 ...
本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解
本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...
8.2 理解Session的缓存 8.2.1 Session的缓存的作用 8.2.2 脏检查及清理缓存的机制 8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 ...
8.2 理解Session的缓存 8.2.1 Session的缓存的作用 8.2.2 脏检查及清理缓存的机制 8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 ...
8.2 理解Session的缓存 8.2.1 Session的缓存的作用 8.2.2 脏检查及清理缓存的机制 8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 ...
9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? 16. hibernate进行多表查询每个表中各取几个字段,也...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各...
9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托方案怎么配置? 134 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...