gpt4 book ai didi

java - hibernate "Provided id of the wrong type expected Long, got class DelayedPostInsertIdentifier"异常

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:24 25 4
gpt4 key购买 nike

简而言之:

当我尝试将新(未保存)实体添加到已保存父实体的一对多集合时,在对父实体调用 Merge 后,出现以下异常:

Provided id of the wrong type for class com.test.Child. Expected: class java.lang.Long, got class org.hibernate.action.internal.DelayedPostInsertIdentifier

我找到了代表相同问题的票证:https://hibernate.atlassian.net/browse/HHH-2382它被拒绝了,对我的问题没有多大帮助。

有人遇到过这个问题吗?谁能指出问题的根源和可能的解决方案?

问题详情:

我有两个类: public class Parent extends BaseModel implements Serializable { 私有(private)长号; 私有(private)集合子项;

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);

第二次调用保存方法后,出现以下异常:

org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.text.Child. Expected: class java.lang.Long, got class org.hibernate.action.internal.DelayedPostInsertIdentifier at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:134) at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1092) at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1019) at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:648) at org.hibernate.type.EntityType.resolve(EntityType.java:468) at org.hibernate.type.EntityType.replace(EntityType.java:325) at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:517) at org.hibernate.type.CollectionType.replace(CollectionType.java:667) at org.hibernate.type.TypeHelper.replace(TypeHelper.java:177) at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:372) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:184) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:157) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:914) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:898) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:902) at com.test.DAOFacade.saveObject(DAOFacade.java:273) at 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 中都正确运行,但实际上它导致了以下问题:

  • 在合并期间,在迭代字段期间,未保存的“第二”子项是找到了。
  • “第二个” child 被标记为插入,插入查询已准备好并被放入 QueryQueue。
  • 继续合并过程,Hibernate 在某个时刻试图加载“第二个”子节点
  • 但是它还没有被插入并且引发了 Excpetion。

最佳答案

我也遇到过这个问题。请注意您的 saveOrUpdate 方法没有启动事务。解决方案是启动事务并确保在调用 session.update 或 session.saveOrUpdate 之后提交事务。

像这样更新您的 saveOrUpdate 方法:

public void saveOrUpdate(T obj) {
Session session = getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
BaseModel model = (BaseModel) obj;
if (model.isNew()) {
T merged = (T)session.merge(obj);
session.update(merged);
} else {
session.saveOrUpdate(obj);
}
tx.commit();
} catch (Exception ex) {
tx.rollback();
}

}

thread给了我解决问题的提示,您的 saveOrUpdate 方法验证了丢失的交易。

关于java - hibernate "Provided id of the wrong type expected Long, got class DelayedPostInsertIdentifier"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com