Hibernate "The identifier of the wrong type is provided, expected by Long, which received a DelayedPostInsertIdentifier class exception" exception

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 .
+4
2

. , 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();
   }

}

, saveOrUpdate .

+1

Hibernate 4.2.15 Spring. @Transactional , , , @arjaynacion:

@Transactional
 @NotNull
 protected S save(@NotNull S entity)
 {
    return getDao().save(entity);
 }
0

All Articles