Hibernate java.lang.ClassCastException: org.hibernate.action.EntityIdentityInsertAction 无法转换为 org.hibernate.action.EntityInsertAction

6

我正在使用带有EntityManager的Hibernate。当我使用

    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)

由于未说明导致问题的实体,因此我在这里无法进行。 有人知道是什么原因导致的吗?

2个回答

2
这是Hibernate的一个bug。当以下条件满足时,会抛出异常:
  • id生成策略为identity
  • 实体在事务之外保存
  • hibernate.order_insertstrue
这是因为EntityIdentityInsertAction可能被添加到ActionQueue.insertions列表中,而ActionQueue$InsertActionSorter期望它只包含EntityInsertAction
看起来这个bug还没有被报告,所以可以自由报告
也许您可以将hibernate.order_inserts的值更改为解决方法。

0

我之所以遇到这个错误,只是因为我忘记在调用em.persist(myNewEntity)的方法上添加@Transactional注解,因为我认为所有的调用者都会在事务中,

错误不是直接弹出来的,但当我尝试从一个表中删除所有行时,它就出现了。

实际上,这个错误很容易让人误解,但与@axtavt answer中的第二种情况相同。

所以

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接