6

当我在执行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;

     ...
}

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

我错过了什么吗?

编辑

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

这确实缩小了问题的范围,但为什么我的交易此时不活跃?

4

2 回答 2

5

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

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

于 2014-03-10T08:49:39.743 回答
0

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

于 2012-02-17T14:08:41.173 回答