getResultList () в init-методе выдает ошибку "сессия закрыта" - PullRequest
1 голос
/ 17 октября 2011

Я пытаюсь загрузить некоторые данные из БД в методе init моего класса обслуживания, но когда я вызываю метод "getResultList ()", возникает исключение "Сессия закрыта".

my applicationContext.xml

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />    
<bean id="testService" class="com.impl.TestServiceImpl" init-method="init" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

мой класс обслуживания:

public Class TestServiceImpl implements TestService {
private EntityManager entityManager;

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
   this.entityManager = entityManager;
}   

public void init() {
    Query query = entityManager.createQuery("from myTable");
    query.getResultList();  // this causes error...
}
}

Это сообщение об ошибке:

SEVERE: Exception sending context initialized event to listener instance of class 
org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'testService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: 
Invocation of init method failed; nested exception is
javax.persistence.PersistenceException: org.hibernate.SessionException: Session is 
closed!
Caused by: javax.persistence.PersistenceException: org.hibernate.SessionException: 
Session is closed!
at 
org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)

Так что я здесь не так делаю?Как я могу решить эту проблему?Спасибо.

1 Ответ

2 голосов
/ 17 октября 2011

Прежде всего, ваш TestServiceImpl не помечен @Transactional, но даже если бы он был, он бы не работал, см .: Транзакционный init-метод и SPR-2740 - что объясняет это по замыслу.

Что вы можете сделать, это использовать init() метод только для вызова бизнес-метода другого компонента, который помечен @Transactional.

private TestDao testDao;

public void init() {
  testDao.findAll();
}

А в TestDao боб:

private EntityManager entityManager;

@Transactional
public findAll() {
  Query query = entityManager.createQuery("from myTable");
  return query.getResultList();
}
...