当我在执行以下命令时尝试访问延迟加载异常时,遇到了 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 注释,它将使 session 保持事件状态,直到该方法完成,从而允许我访问延迟加载的地址收藏。
我错过了什么吗?
编辑
根据 Tomasz 的建议:在我的 displayAddresses()
方法中,TransactionSynchronizationManager.isActualTransactionActive(),
的状态结果为 false
。
这确实缩小了问题范围,但为什么我的交易此时不活跃?
最佳答案
这已经得到回答,但只是想发布一个替代答案,该答案在类似的情况下对我有用 - 对于后代;)
在我的例子中,问题是由于包含延迟加载集合的实例已被手动逐出(全部在事务边界内)这一事实引起的。
关于hibernate - @Transactional 方法中的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9318127/