@Transactional方法中的LazyInitializationException

Tyl*_*rry 6 spring hibernate transactional

在执行以下操作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());
}
Run Code Online (Sandbox Code Playgroud)

我的实体看起来像这样:

@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;

     ...
}
Run Code Online (Sandbox Code Playgroud)

我的印象是,通过在我的displayAddresses()方法中使用@Transactional批注,它将使会话保持活动状态,直到该方法完成为止,从而使我可以访问延迟加载的Address集合。

我想念什么吗?

编辑

按照Tomasz的建议:在我的displayAddresses()方法中,状态TransactionSynchronizationManager.isActualTransactionActive(),变为false

这确实可以缩小问题的范围,但是为什么此时我的交易不能处于活动状态?

mac*_*ery 5

这已经得到回答,但只是想发布一个在类似情况下对我有用的替代答案 - 为后代;)

在我的情况下,问题是由于包含延迟加载集合的实例已被手动逐出(都在事务边界内)这一事实引起的。


Tyl*_*rry 0

在我的配置文件中<tx:annotation-driven />并使用 Spring 管理的服务类版本(调用 displayAddresses() 方法)就可以了。