在另一笔交易中延迟加载集合?

时间:2018-11-13 01:11:49

标签: java hibernate

我知道,如果您加载一个对象,请在休眠状态下关闭一个会话,然后尝试获取有关相关对象的信息,而此关联的FetchType为LAZY则显然会给您LazyInitializationException。有人可以告诉我为什么如果我开始另一个事务然后尝试加载相关的对象,我仍然会收到此异常吗?可以说我有讲师课和一对多相关的课程课。课程是延迟加载的。

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Instructor instructor= session.get(Instructor.class, id);
session.getTransaction().commit();

session = sessionFactory.getCurrentSession();
session.beginTransaction();
System.out.println(instructor.getCourses());

session.getTransaction().commit();

为什么我仍然会出现LazyInitializationException?

1 个答案:

答案 0 :(得分:0)

关键问题在于,在一个事务中加载的数据可能与在较早事务中加载的数据相矛盾,因为与此同时另一事务可能已修改了数据。

也就是说,每个事务将(或者在隔离级别较弱的情况下努力)为您提供数据库状态的一致视图-但是将在不同时间获取的视图组合在一起可能会导致数据视图不一致,这可能会导致逻辑错误。

也就是说,可以通过使用“扩展的持久性上下文”来扩展跨事务的延迟加载-但根据我的经验,该功能很少使用。