Hibernate java.lang.ClassCastException: org.hibernate.action.EntityIdentityInsertAction не может быть приведен к org.hibernate.action.EntityInsertAction - PullRequest
6 голосов
/ 14 сентября 2011

Я использую 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)

Поскольку здесь не сказано, какая сущность вызывает проблему, я застрял здесь. У кого-нибудь есть идеи, что может вызвать это?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Это ошибка в Hibernate. Исключение выдается при соблюдении следующих условий:

  • стратегия генерации идентификатора: identity
  • объект сохраняется вне транзакции
  • hibernate.order_inserts - это true

Это происходит потому, что EntityIdentityInsertAction можно добавить в список ActionQueue.insertions, тогда как ActionQueue$InsertActionSorter ожидает, что он содержит только EntityInsertAction s.

Похоже, что об этой ошибке еще не сообщалось, поэтому не стесняйтесь сообщать об этом .

Возможно, вы можете изменить значение hibernate.order_inserts в качестве обходного пути.

0 голосов
/ 06 марта 2019

Я получил эту ошибку только потому, что забыл добавить аннотацию @Transactional к методу, который вызывает em.persist(myNewEntity), поскольку я думал, что все вызывающие абоненты будут в транзакции,

ошибка не появляется напрямую, но когдаЯ пытался удалить все строки из таблицы

на самом деле ошибка вводит в заблуждение, но она такая же, как и во втором случае в @ axtavt answer

, поэтому

убедитесь, что операция сохранения выполняется в активной транзакции

...