【问题标题】:LazyInitializationException in Thread with Spring Roo 1.5带有 Spring Roo 1.5 的线程中的 LazyInitializationException
【发布时间】:2012-01-18 14:21:10
【问题描述】:

我有一个使用 Spring Roo 1.5(带休眠功能的 mysql)的项目,我创建了一个 Thread 类(从 Thread 扩展),因为我需要调用异步操作。但是当我试图得到这个时,例如来自持久性类的属性发生异常。这只发生在我从 Thread 类调用时...

我的实体类:

@RooJavaBean
@RooToString
@RooEntity
public class Consulta {
    private String nombre;

    @OneToMany(cascade=CascadeType.ALL)
    private List<DetalleConsulta> detalleConsulta;
}

我的话题:

public class ThreadIngresarConsulta extends Thread {

    private Long idConsulta;

    public ThreadIngresarConsultaCRM(Long idConsulta) {
        super("ThreadIngresarConsultaCRM");
        this.idConsulta = idConsulta;
    }


    public void run(){
        try {
            Consulta consulta = Consulta.findConsulta(idConsulta);
            List<DetalleConsulta> lista = consulta.getDetalleConsulta();
        }catch(Exception e) {
            System.err.println(e.getMessage());
        }        
    }
}

ApplicactionContext(由 roo 生成)

...
   <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
        <property name="validationQuery" value="SELECT 1"/>
    </bean>
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
        <property name="persistenceUnitName" value="persistenceUnit"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

这是个例外:

011-12-05 18:49:10,015 [ThreadIngresarConsulta] ERROR org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.core.Consulta.detalleConsulta, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.core.Consulta.detalleConsulta, no session or session was closed

有没有人尝试在线程中调用实体 JPA?

【问题讨论】:

    标签: multithreading hibernate spring exception jpa


    【解决方案1】:

    尝试在线程的 run 方法上添加 @Transactional 注释。如果这不起作用,请将这两行移到一个单独的方法中,并在该方法上添加 @Transactional。

    public class ThreadIngresarConsulta extends Thread {
    
        public void run(){
           doProcess();
        }
    
        @Transactional
        public void doProcess() {
            try {
                Consulta consulta = Consulta.findConsulta(idConsulta);
                List<DetalleConsulta> lista = consulta.getDetalleConsulta();
            }catch(Exception e) {
                System.err.println(e.getMessage());
            }        
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-25
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多