【问题标题】:Session is closed on spring bean with @Transactional使用 @Transactional 在 Spring bean 上关闭会话
【发布时间】:2017-10-21 01:36:31
【问题描述】:

我正在开始一个新线程来做一些艰苦的工作。所以我创建了一个像这样扩展 Thread 的 Spring bean:

@Component
@Scope("prototype")
public class AtualizaMovimentacoesThread extends Thread{
    @Inject
    MovimentacoesService service;

    @Override
    public void run() {
        movimentacoesService.atualizarEleEFilhos(...);
    }
}

因此,MovimentacoesService bean 完成了艰苦的工作。

@Component
@Service
public class MovimentacoesCastor implements MovimentacoesService {

    @Override
    @Transactional()
    public void atualizarEleEFilhos(...) {
    }
}

但是,当 atualizarEleEFilhos 执行时,我没有收到任何会话或会话已关闭异常:

Exception in thread "Thread-20" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.opatecnologia.castor.domain.Lancamento.cobrancas, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122)
at org.hibernate.collection.PersistentSet.isEmpty(PersistentSet.java:169)
at br.com.opatecnologia.castor.domain.Lancamento.getCobranca(Lancamento.java:277)
at br.com.opatecnologia.castor.domain.Lancamento.getDataVencimento(Lancamento.java:915)
at br.com.opatecnologia.castor.service.impl.MovimentacoesCastor.atualizarEleEFilhos(MovimentacoesCastor.java:518)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy112.atualizarEleEFilhos(Unknown Source)
at br.com.opatecnologia.castor.util.AtualizaMovimentacoesThread.run(AtualizaMovimentacoesThread.java:52)

Spring 和 Hibernate 日志,表示事务和会话已打开:

14:47:19,454 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'transactionManager'
14:47:19,454 DEBUG [JpaTransactionManager] Creating new transaction with name     [br.com.opatecnologia.castor.service.impl.MovimentacoesCastor.atualizarEleEFilhos]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
14:47:19,454 DEBUG [SessionImpl         ] opened session at timestamp: 15085180394
14:47:19,454 DEBUG [JpaTransactionManager] Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@7d218878] for JPA transaction
14:47:19,454 DEBUG [JDBCTransaction     ] begin
14:47:19,454 DEBUG [ConnectionManager   ] opening JDBC connection
14:47:19,454 DEBUG [JDBCTransaction     ] current autocommit status: false
14:47:19,456 DEBUG [JpaTransactionManager] Initiating transaction rollback
14:47:19,456 DEBUG [JpaTransactionManager] Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@7d218878]
14:47:19,456 DEBUG [JDBCTransaction     ] rollback
14:47:19,456 DEBUG [JDBCTransaction     ] rolled back JDBC Connection
14:47:19,456 DEBUG [ConnectionManager   ] aggressively releasing JDBC connection
14:47:19,456 DEBUG [ConnectionManager   ] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
14:47:19,457 DEBUG [JpaTransactionManager] Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@7d218878] after transaction

我错过了什么吗?

Ps:我通常在控制器中注入 AtualizaMovimentacoesThread 并调用 start 执行线程。

【问题讨论】:

    标签: java spring hibernate session


    【解决方案1】:

    我找到了解决办法。

    我将传递给 atualizarEleEFilhos,这是一个由 hibernate 在线程外加载的对象,它解释了 LazyInitializationException

    所以,我只需重新加载对象,现在一切正常! :D

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 2011-07-06
      • 2017-12-10
      • 2011-12-31
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多