LazyInitializationException, несмотря на транзакцию Spring? - PullRequest
4 голосов
/ 14 января 2011

Приведенный ниже метод приводит к выбрасыванию org.hibernate.LazyInitializationException, и я был бы признателен за помощь в понимании почему. Я использую JPA 2 / Hibernate & Spring.

JPA 2 / Hibernate используют постоянный контекст по умолчанию transaction, поэтому разве метод, описанный ниже, не должен допускать отложенную загрузку?

@Service
public class GalleryService {
    @Transactional(readOnly=true)
    public Response getGallery(@PathParam("id") int id) {
        Gallery g = daoWrapper.findById(Gallery.class, id);
        ...
        GalleryDto gDto = new GalleryDto();
        ...
        // getImages() returns a collection of 'image' objects.
        gDto.setImages(g.getImages());
        return Response.ok(gDto).build();
    }
}

Примечание : daoWrapper - это вспомогательный класс, заключающий методы менеджера сущностей.

@Repository
public class daoWrapper implements BaseDao {

   @PersistenceContext(unitName="persistStore") 
   private EntityManager em;

   @Override
   public <T,U> T findById(Class<T> entity, U id) {
        return this.em.find(entity, id);
   }
   ...
}

Файл контекста приложения:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<context:property-placeholder location="classpath:database.properties" />
<context:annotation-config />
<context:component-scan base-package="com.myapp.services"/>
<tx:annotation-driven/>
...
</beans>

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Нам нужно намного больше информации, чтобы диагностировать это, но я склонен видеть вашу подпись в том, что она находится в классе контроллера, который не передается через прокси.@Transactional будет работать только с классами, которые проксируются фабрикой бинов, во многих общих способах настройки контекста, это не включает классы контроллера.

0 голосов
/ 14 сентября 2017

Я обнаружил ту же проблему при вызове

session.clear();

где-то между

entity = session.get(...);

и

entity.getLazyCollection();

Так что просто проверьте свой код, чтобы не использовать этот метод.

0 голосов
/ 14 января 2011

Что @Affe спрашивал, это ваша весенняя конфигурация? Если вы получаете исключение LazyInitializationException, транзакция не выполняется. Как упоминалось в @Affe, транзакция будет запущена только в том случае, если созданы прокси, и это может быть связано с некоторой проблемой в вашей конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...