【问题标题】:StatelessSession being cast to Session in AbstractEntityPersister (Hibernate)StatelessSession 被强制转换为 AbstractEntityPersister (Hibernate) 中的 Session
【发布时间】:2016-11-13 20:41:54
【问题描述】:

我正在尝试对 StatelessSession 进行简单的保存。有人可以发现我做错了什么,最终导致 Hibernate 方法尝试对 Session 进行无效的 StatelessSession 强制转换。如有任何反馈,我将不胜感激。

我的示例代码: 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)

【问题讨论】:

  • 请在上面的问题中添加堆栈跟踪
  • 添加了堆栈跟踪。谢谢...

标签: hibernate classcastexception stateless-session


【解决方案1】:

已经为此打开了一个问题请求!这应该在 Hibernate 5.2.2 中可用

https://hibernate.atlassian.net/browse/HHH-11048

getEntityMetamodel().hasPreInsertGeneratedValues() 返回 true,因为您必须拥有在插入之前由 hibernate 生成的东西!

示例:时间戳或自动生成的 ID 等

【讨论】:

  • 我正在使用 Hibernate 5.4.9(带有弹簧启动),但仍然发生此错误。
【解决方案2】:

Hibernate 最新版本 (5.4.09) 中仍有此问题

实际问题出在实体类,如果实体类有一些自动生成的属性,如@CreationTimestamp,hibernate StatelessSession插入/更新函数会抛出这个错误“java.lang.ClassCastException: org.hibernate .internal.StatelessSessionImpl 不能转换为 org.hibernate.Session"

例如:

@CreationTimestamp 私人日期 createdDate;

解决方案手动设置这些属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2021-03-13
    相关资源
    最近更新 更多