Hibernate java.lang.ClassCastException:org.Hibernate.action.EntityIdentityInsertAction不能强制转换为org.Hibernate.action.EntityInsertAction

Hibernate java.lang.ClassCastException:org.Hibernate.action.EntityIdentityInsertAction不能强制转换为org.Hibernate.action.EntityInsertAction,hibernate,flush,classcastexception,entitymanager,Hibernate,Flush,Classcastexception,Entitymanager,我正在使用Hibernate和EntityManager。当我使用 Session session = (Session)entityManager.getDelegate(); session.flush(); session.clear(); 我明白了 java.lang.ClassCastException: org.hibernate.action.EntityIdentityInsertAction cannot be cast to org.hibern

我正在使用Hibernate和EntityManager。当我使用

    Session session = (Session)entityManager.getDelegate();  
    session.flush();
    session.clear();
我明白了

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)

因为它没有说是哪个实体导致了问题,所以我被困在这里。有人知道是什么导致了这种情况吗?

这是Hibernate中的一个bug。满足以下条件时引发异常:

  • id生成策略是
    identity
  • 实体保存在事务外部
  • hibernate.order\u inserts
    true
之所以会发生这种情况,是因为
EntityIdentityInsertAction
可以添加到
ActionQueue.insertions
列表中,而
ActionQueue$InsertActionSorter
希望它只包含
EntityInsertAction
s

看起来这个bug还没有被报告,所以


也许您可以更改
hibernate.order\u inserts
的值作为解决方法。

我之所以出现此错误,是因为我忘记在调用
em.persist(myNewEntity)
的方法上添加
@Transactional
注释,因为我以为所有调用方都将进行事务处理

错误不是直接弹出的,而是当我试图从表中删除所有行时

事实上,这个错误是有误导性的,但它与第二种情况相同

所以

确保在活动事务中完成保存操作