LazyInitializationException в потоке с Spring Roo 1.5 - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть проект с Spring Roo 1.5 (mysql w / hibernate), я создал класс Thread (расширяется от Thread), потому что мне нужно вызывать асинхронные операции. Но когда я пытался получить это, например, свойство из класса persitence возникает исключение. Это происходит только тогда, когда я звоню из класса 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 в потоке?

1 Ответ

4 голосов
/ 12 декабря 2011

Попробуйте добавить аннотацию @Transactional в метод run вашего потока. Если это не сработает, переместите две строки в отдельный метод и добавьте @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());
        }        
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...