22.4. 级联与未保存值(unsaved-value)
Suppose we loaded up a
Parent
in one Session
, made some changes in a UI action and wanted to persist these changes in a new session by calling update()
. The Parent
will contain a collection of children and, since the cascading update is enabled, Hibernate needs to know which children are newly instantiated and which represent existing rows in the database. We will also assume that both Parent
and Child
have generated identifier properties of type Long
. Hibernate will use the identifier and version/timestamp property value to determine which of the children are new. (See 第 10.7 节 “自动状态检测”.) In Hibernate3, it is no longer necessary to specify an unsaved-value
explicitly.
下面的代码会更新
parent
和 child
对象,并且插入 newChild
对象。
//parent and child were both loaded in a previous session
parent.addChild(child);
Child newChild = new Child();
parent.addChild(newChild);
session.update(parent);
session.flush();
这 对于自动生成标识的情况是非常好的,但是自分配的标识和复合标识怎么办呢?这是有点麻烦,因为 Hibernate 没有办法区分新实例化的对象(标识被用户指定了)和前一个 Session 装入的对象。在这种情况下,Hibernate 会使用 timestamp 或 version 属性,或者查询第二级缓存,或者最坏的情况,查询数据库,来确认是否此行存在。