在执行以下操作org.hibernate.LazyInitializationException时,当我尝试访问延迟加载的异常时遇到错误:
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集合。
displayAddresses()
我想念什么吗?
编辑
按照Tomasz的建议:在我的displayAddresses()方法中,状态TransactionSynchronizationManager.isActualTransactionActive(),变为false。
TransactionSynchronizationManager.isActualTransactionActive(),
false
这确实可以缩小问题的范围,但是为什么此时我的“交易”不能处于活动状态?
有<tx:annotation-driven />在我的配置文件,然后使用我的服务类的Spring管理的版本(调用()方法displayAddresses)并获得成功。
<tx:annotation-driven />