首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AbstractEntityPersister (Hibernate)中将StatelessSession强制转换为会话

问在AbstractEntityPersister (Hibernate)中将StatelessSession强制转换为会话
EN

Stack Overflow用户
提问于 2016-07-12 03:31:54
回答 2查看 969关注 0票数 2

我正在试着在StatelessSession上做一个简单的节省。有没有人能发现我做错了什么,最终进入了Hibernate方法,该方法试图将StatelessSession转换为会话。如果有任何反馈,我将不胜感激。

我的示例代码:StatelessSession statelessSession = getSessionFactory().openStatelessSession(); Transaction tx = statelessSession.beginTransaction(); Object ret = null; try { ret = statelessSession.insert(obj); tx.commit(); statelessSession.close();

代码语言:javascript
复制
     `} catch (Throwable t) {             System.out.println("exception: " + t.getMessage());             tx.rollback();         }          return (T) ret;`

异常发生在.insert(obj)调用上。跟踪代码后,我进入了AbstractEntityPersister类,它尝试在此方法中将StatelessSession转换为Session:

代码语言:javascript
复制
    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] );
            }
        }
    }
}

下面是堆栈跟踪:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2016-10-21 00:27:30

已经存在为此打开的出库请求!这在Hibernate 5.2.2中应该是可用的

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

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

例如:时间戳或自动生成的ids等。

票数 2
EN

Stack Overflow用户

发布于 2020-01-08 00:38:57

此问题在Hibernate最新版本(5.4.09)中仍然存在

实际问题出在entity类中,如果entity类有一些自动生成的属性,比如@CreationTimestamp,hibernate StatelessSession插入/更新函数会抛出这个错误"java.lang.ClassCastException: org.hibernate.internal.StatelessSessionImpl cannot be cast to org.hibernate.Session“

例如:

@CreationTimestamp私有日期createdDate;

Solution通过手动设置这些属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38314766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档