StatelessSession преобразуется в Session в AbstractEntityPersister (Hibernate)
Я пытаюсь сделать простое сохранение на StatelessSession. Может кто-то заметить, что я делаю неправильно, чтобы оказаться в методе Hibernate, который пытается выполнить недопустимое приведение StatelessSession to Session. Буду признателен за любые отзывы.
Мой пример кода:
StatelessSession statelessSession = getSessionFactory().openStatelessSession();
Transaction tx = statelessSession.beginTransaction();
Object ret = null;
try {
ret = statelessSession.insert(obj);
tx.commit();
statelessSession.close();
} catch (Throwable t) {
System.out.println("exception: " + t.getMessage());
tx.rollback();
}
return (T) ret;
Исключение возникает при вызове.insert(obj). При отслеживании кода я попадаю в класс AbstractEntityPersister, который пытается преобразовать этот StatelessSession в Session с помощью этого метода:
private void preInsertInMemoryValueGeneration(Object[] fields, Object object, SessionImplementor session) {
if ( getEntityMetamodel().hasPreInsertGeneratedValues() ) {
final InMemoryValueGenerationStrategy[] strategies = getEntityMetamodel().getInMemoryValueGenerationStrategies();
for ( int i = 0; i < strategies.length; i++ ) {
if ( strategies[i] != null && strategies[i].getGenerationTiming().includesInsert() ) {
fields[i] = strategies[i].getValueGenerator().generateValue( (Session) session, object ); // <-- bad cast here
setPropertyValue( object, i, fields[i] );
}
}
}
}
Вот трассировка стека:
java.lang.ClassCastException: org.hibernate.internal.StatelessSessionImpl cannot be cast to org.hibernate.Session
at org.hibernate.persister.entity.AbstractEntityPersister.preInsertInMemoryValueGeneration(AbstractEntityPersister.java:3591)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3568)
at org.hibernate.internal.StatelessSessionImpl.insert(StatelessSessionImpl.java:144)
at org.hibernate.internal.StatelessSessionImpl.insert(StatelessSessionImpl.java:123)
at com.mycompany.somepackage.dao.impl.CommonDAOImpl.persist2(CommonDAOImpl.java:242)
at com.mycompany.somepackage.publisher.ScJournalPublisher.publish(ScJournalPublisher.java:37)
at com.mycompany.somepackage.annotation.callback.CallbackInvoker.invokePublisherCallback(CallbackInvoker.java:92)
at com.mycompany.somepackage.event.listener.DaPostInsertUpdateEventListener.onPostInsert(DaPostInsertUpdateEventListener.java:51)
at org.hibernate.action.internal.EntityInsertAction.postInsert(EntityInsertAction.java:177)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:145)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:521)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
1 ответ
Для этого уже открыт запрос на выдачу! Это должно быть доступно в Hibernate 5.2.2
https://hibernate.atlassian.net/browse/HHH-11048
getEntityMetamodel().hasPreInsertGeneratedValues()
возвращает true, поскольку у вас должно быть что-то, что генерируется hibernate перед вставкой!
Пример: метка времени или автоматически сгенерированные идентификаторы и т. Д.
Эта проблема все еще присутствует в последней версии Hibernate (5.4.09).
Фактическая проблема заключается в классе сущности, если класс сущности имеет некоторые автоматически сгенерированные свойства, такие как @CreationTimestamp, функция вставки / обновления StatelessSession спящего режима вызовет эту ошибку: "java.lang.ClassCastException: org.hibernate.internal.StatelessSessionImpl не может быть преобразован в org.hibernate.Session"
Например:
@CreationTimestampprivate Date createdDate;
Решение устанавливает такие свойства вручную.