2011-12-12 57 views
0

我有一個Spring Roo 1.5(mysql w/hibernate)項目,我做了一個Thread類(從Thread擴展),因爲我需要調用異步操作。但是,當我試圖得到這個,例如來自persitence類的屬性發生異常。這僅當我從Thread類調用時...LazyInitializationException Thread in Spring Roo 1.5

我的實體類:

@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(由袋鼠生成)

... 
    <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?

回答

4

嘗試在線程的運行方法上放置@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()); 
     }   
    } 
}