【发布时间】:2015-01-12 02:11:15
【问题描述】:
简而言之:
当我尝试将 New(Unsaved) Entities 添加到一对多的已保存父实体集时,在父实体上调用 Merge 后,我收到以下异常:
为类 com.test.Child 提供了错误类型的 id。预期的: 类 java.lang.Long,得到类 org.hibernate.action.internal.DelayedPostInsertIdentifier
我找到了一张代表相同问题的票:https://hibernate.atlassian.net/browse/HHH-2382 它被拒绝了,对我的问题没有多大帮助。
有人遇到过这个问题吗? 谁能指出问题的根源和可能的解决方案?
问题详情:
我有两个课程: 公共类父扩展BaseModel实现可序列化{ 私人长ID; 私人 Set 孩子; }
public class Child extends BaseModel implements Serializable {
private long id;
private String value;
}
我正在尝试执行以下代码:
Parent parent = new Parent();
parent.setChildren(new HashSet<Child>());
Child child = new Child();
child.setValue("First");
parent.getChildren().add(child);
parent = daoFacade.save(parent);
child = new Child();
child.setValue("Second");
parent.getChildren().add(child);
parent = daoFacade.save(parent);
第二次调用 save 方法后,我得到以下异常:
org.hibernate.TypeMismatchException:为 com.text.Child 类。预期:类 java.lang.Long,得到类 org.hibernate.action.internal.DelayedPostInsertIdentifier 在 org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:134) 在 org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1092) 在 org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1019) 在 org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:648) 在 org.hibernate.type.EntityType.resolve(EntityType.java:468) 在 org.hibernate.type.EntityType.replace(EntityType.java:325) 在 org.hibernate.type.CollectionType.replaceElements(CollectionType.java:517) 在 org.hibernate.type.CollectionType.replace(CollectionType.java:667) 在 org.hibernate.type.TypeHelper.replace(TypeHelper.java:177) 在 org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:372) 在 org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:184) 在 org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:157) 在 org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76) 在 org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:914) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:898) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:902) 在 com.test.DAOFacade.saveObject(DAOFacade.java:273) 在 com.test.Test.testSaving(MemcachedTest.java:99)
DaoFacade.save 方法如下所示:
public void saveOrUpdate(T obj) {
Session session = getSession();
BaseModel model = (BaseModel) obj;
if (model.isNew()) {
T merged = (T)session.merge(obj);
session.update(merged);
} else {
session.saveOrUpdate(obj);
}
session.flush();
}
Hibernate 映射是:
<class name="Parent" table="PARENT">
<id name="id" column="id" unsaved-value="0">
<generator class="native"/>
</id>
<set name="children" inverse="false" lazy="false" cascade="all">
<cache usage="read-write" />
<key column="LINK_ID"/>
<one-to-many class="Child"/>
</set>
</class>
<class name="Child" table="CHILD">
<cache usage="read-write" />
<id name="id" column="id" unsaved-value="0">
<generator class="native"/>
</id>
<property name="value" type="string" column="VALUE" not-null="true" lazy="false"/>
</class>
我已经调试了几个小时,所有进程在 Hibernate 中似乎都正常,但实际上它导致了以下问题:
- 在合并期间,在迭代字段期间,未保存的“第二个”子项是 找到了。
- “第二个”子级标记为插入,插入查询已准备好并被放入 QueryQueue。
- 继续合并过程,Hibernate 有时会尝试加载“第二个”子节点
- 但它尚未插入,并且引发了 Excpetion。
【问题讨论】:
标签: java hibernate one-to-many hibernate-onetomany