Search code examples
hibernateflushclasscastexceptionentitymanager

Hibernate java.lang.ClassCastException: org.hibernate.action.EntityIdentityInsertAction cannot be cast to org.hibernate.action.EntityInsertAction


I'm using Hibernate with an EntityManager. When I use

    Session session = (Session)entityManager.getDelegate();  
    session.flush();
    session.clear();

I get

java.lang.ClassCastException: org.hibernate.action.EntityIdentityInsertAction cannot be cast to org.hibernate.action.EntityInsertAction
at org.hibernate.engine.ActionQueue$InsertActionSorter.sort(ActionQueue.java:636)
at org.hibernate.engine.ActionQueue.sortInsertActions(ActionQueue.java:369)
at org.hibernate.engine.ActionQueue.sortActions(ActionQueue.java:355)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:224)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)

Since it doesn't say which entity causes the problem, I'm stuck here. Does anyone have an idea what can cause this?


Solution

  • It's a bug in Hibernate. Exception is thrown when following conditions are met:

    • id generation strategy is identity
    • entity is saved outside of transaction
    • hibernate.order_inserts is true

    It happens because EntityIdentityInsertAction can be added to the ActionQueue.insertions list, whereas ActionQueue$InsertActionSorter expects that it contains only EntityInsertActions.

    It looks like this bug was not reported yet, so feel free to report it.

    Perhaps you can change the value of hibernate.order_inserts as a workaround.