当前位置: 首页 > 面试题库 >

@Transactional方法中的LazyInitializationException

尹晟
2023-03-14
问题内容

在执行以下操作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

这确实可以缩小问题的范围,但是为什么此时我的“交易”不能处于活动状态?


问题答案:

<tx:annotation-driven />在我的配置文件,然后使用我的服务类的Spring管理的版本(调用()方法displayAddresses)并获得成功。



 类似资料:
  • 问题内容: 我想在应用程序开始时阅读文本数据装置(CSV文件),并将其放入数据库中。 为此,我创建了带有初始化方法(@PostConstruct批注)的PopulationService。 我也希望它们在单个事务中执行,因此我在同一方法上添加了@Transactional。 然而,@Transactional似乎被忽略:该交易启动/停止我的低水平DAO方法。 那我需要手动管理交易吗? 问题答案:

  • 我有一个dao类(),它用annotaion(在类级别)标记,没有其他参数。在这个dao类中,我有一个方法,在某些情况下,它需要抛出一个已检查的异常并执行事务回滚。类似这样的事情: 这个很好用。但是,这个dao方法是从一个服务方法调用的,该服务方法也被标记为@transactional: 问题是,当从调用并将事务标记为仅回滚时,我会得到一个。 Spring创建了两个事务拦截器:一个用于,一个用于。

  • 问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导

  • 问题内容: 美好的一天。如下代码: 据我了解,如果方法中存在异常,则不会回滚事务。以及如何使它滚动?并返回SomeResult 问题答案: 您不应该以编程方式调用回滚。根据docs的建议,最好的方法是使用声明性方法。为此,您需要注释哪些异常将触发回滚。 在你的情况下,像这样 看一下@Transaction API 和有关回滚事务的文档。 如果尽管有文档建议,但仍要进行程序化回滚,则需要按照已建议的