LazyInitializationException在@Transactional方法中

时间:2012-02-16 19:54:13

标签: hibernate spring 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());
}

我的实体看起来像这样:

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

     ...
}

我的印象是,通过在我的displayAddresses()方法中使用@Transactional注释,它会使会话保持活动状态,直到方法完成,允许我访问延迟加载的Address集合。

我错过了什么吗?

修改

根据Tomasz的建议:在displayAddresses()方法中,TransactionSynchronizationManager.isActualTransactionActive(),的状态为false

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

2 个答案:

答案 0 :(得分:4)

这已经得到了解答,但我只想发布一个替代答案,这个答案对我来说在类似情况下适用于后代;)

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

答案 1 :(得分:0)

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