当我在执行以下操作时尝试访问延迟加载的异常时,我遇到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
。
这确实缩小了问题的范围,但为什么我的交易此时不会处于活动状态?
答案 0 :(得分:4)
这已经得到了解答,但我只想发布一个替代答案,这个答案对我来说在类似情况下适用于后代;)
在我的情况下,问题是由于包含延迟加载的集合的实例已被手动驱逐(全部在事务边界内)这一事实引起的。
答案 1 :(得分:0)
在我的配置文件中使用<tx:annotation-driven />
并使用Spring管理的服务类版本(调用displayAddresses()方法)就可以了。