LazyInitializationException в методе @Transactional - PullRequest
5 голосов
/ 16 февраля 2012

Я сталкиваюсь с ошибкой org.hibernate.LazyInitializationException, когда пытаюсь получить доступ к отложенному загруженному исключению при выполнении следующих действий:

@Transactional
public void displayAddresses()
{
     Person person = getPersonByID(1234);
     List<Address> addresses = person.getAddresses(); // Exception Thrown Here

     for(Address address : addresses)
          System.out.println(address.getFullAddress());
}

Мои объекты выглядят так:

@Entity
@Table("PERSON_TBL")
public class Person
{
     ...

     @OneToMany(cascade=CascadeType.ALL, targetEntity=Address.class, mappedBy="person")
     private List<Address> addresses;

     ...
}

@Entity
@Table("ADDRESS_TBL")
public class Address
{
     ...

     @ManyToOne(targetEntity=Person.class)
     @JoinColumn(name="PERSON_ID", referencedColumnName="PERSON_ID")
     Person person;

     ...
}

У меня сложилось впечатление, что, используя аннотацию @Transactional в моем методе displayAddresses(), он будет поддерживать сеанс до тех пор, пока метод не будет завершен, что позволит мне получить доступ к коллекции ленивых загруженных адресов.

что-то упустили?

РЕДАКТИРОВАТЬ

В соответствии с рекомендацией Томаша: В моем методе displayAddresses() статус TransactionSynchronizationManager.isActualTransactionActive(), оказался false.

Это сужает проблему, но почему моя Транзакция не будет активной в этот момент?

Ответы [ 2 ]

4 голосов
/ 10 марта 2014

Это уже ответили, но просто хотел опубликовать альтернативный ответ, который работал для меня в аналогичном случае - для будущих поколений;)

В моем случае проблема была вызвана тем, что экземпляр, который содержал загруженную ленту, был вручную удален (все в пределах границ транзакции).

0 голосов
/ 17 февраля 2012

Наличие <tx:annotation-driven /> в моем файле конфигурации и использование Spring-версии моего класса обслуживания (для вызова метода displayAddresses ()) сделали свое дело.

...