In short:
When I try to add New (Unsaved) Entities to the one-to-many set of the saved parent, after calling Merge on the parent, I get the following exception:
Incorrect type identifier provided for com.test.Child class. Expected: class java.lang.Long, got class org.hibernate.action.internal.DelayedPostInsertIdentifier
I found a ticket representing the same problem: https://hibernate.atlassian.net/browse/HHH-2382
It was rejected and does not help my question very much.
Has anyone encountered this problem? Can someone indicate the source of the problem and a possible solution?
The problem is in the details:
I have two classes: Public class Parent extends BaseModel implements Serializable {private long identifier; private children; }
public class Child extends BaseModel implements Serializable {
private long id;
private String value;
}
I am trying to execute the following code:
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);
And after calling the save method a second time, I get the following exception:
org.hibernate.TypeMismatchException: com.text.Child. : java.lang.Long, org.hibernate.action.internal.DelayedPostInsertIdentifier at 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) at 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();
}
:
<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 - ""
- , Excetchion .