hibernate - @Transactional 方法中的 LazyInitializationException

标签 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 注释,它将使 session 保持事件状态,直到该方法完成,从而允许我访问延迟加载的地址收藏。

我错过了什么吗?

编辑

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

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

最佳答案

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

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

关于hibernate - @Transactional 方法中的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9318127/

相关文章:

java - 如何添加日期,然后将其与 Hibernate 中的当前日期进行比较?

java - Spring MVC 中的模型填充 @ExceptionHandler

java - 从 Spring 渲染 View 时出现 StackOverFlowError

java - 来自数据库表的 i18N 消息 - java spring 3.0

java - Java 持久性中的事务性和非事务性缓存

java - 尽管使用 JsonIgnore,但未能延迟初始化 ManyToMany 关系中的角色集合

mysql - Hibernate:MySQLDialect 和 MySQLInnoDBDialect 有什么区别?

mysql - 如何更新数据库中的日期间隔(Hibernate HQL)

java - Jpa @Transactional 不回滚

mysql - Mysql/Mariadb 删除查询是事务性的吗?及其性能巨大。行数?