Java 为什么不自动为双向访问设置延迟加载关系

Java 为什么不自动为双向访问设置延迟加载关系,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个对象层次结构,其中集合是延迟加载的: Object_1 - List<Object_2> - Object_3 - Object_4 如果现在执行以下操作,将在最后一行引发LazyInitializationException: Object_2 object2 = object1.getObjects2().get(0); Object_3 object3 = object2.getObject3(); Object_4 o

我有一个对象层次结构,其中集合是延迟加载的:

Object_1
    - List<Object_2>
        - Object_3
            - Object_4
如果现在执行以下操作,将在最后一行引发LazyInitializationException:

Object_2 object2 = object1.getObjects2().get(0);
Object_3 object3 = object2.getObject3();
Object_4 object4 = object3.getObject4();
em.getTransaction().commit();

Object_3 object3_1 = object4.getObjects3().get(0);
我假设框架可能已经用第2行加载的对象填充了对象列表_3,因为它们与object4的一对一关系已经被急切地解决了


那么,是否可能,例如,我缺少一些配置?我是否遗漏了什么,我的假设是错误的?或者它只是没有以这种方式实现?

@Transactional
标记您的方法,它应该会有帮助1。您的层次结构是错误的-
object2.getObjects3()
返回一个列表,在您的示例中,它是单个
对象3
。2.如果访问
object2.getObjects3()
查询
Object\u 3
表中与单个
object2
相关的所有对象,并加载它们急切加载的
Object\u 4
——但由于每个
Object\u 4
都可以引用
Object\u 3
的列表,因此假设JPA加载与之无关的另一个
Object\u 3
行开始导航时使用的相应
object2
。@Smutje 1。正确,我已相应地对其进行了编辑。2.根据我的理解,没有必要加载所有与对象4相关的对象3,但是,给定的对象_3被添加到对象_4中的列表中。但是,对象图将不一致,我不想考虑这可能会对其他用例产生的影响-例如,一旦填充了一个列表,JPA如何知道它是否应该扩展列表等等。@Smutje如果集合是一个集合,它就不应该扩展列表。@Smutje要多次添加同一对象,请执行以下操作。不管怎样,你的解释听起来很合理。这个问题的原因是,我正在处理一个陈旧的应用程序,一方面很难同时读取所有内容,因为以后几乎不可能知道到底需要什么,另一方面,人们担心如果在需要的地方读取内容可能会影响性能。
Object_1 object1 = em.find(...);
object1.getObjects2().forEach(o2 -> o2.getObjects3().size());
Object_2 object2 = object1.getObjects2().get(0);
Object_3 object3 = object2.getObject3();
Object_4 object4 = object3.getObject4();
em.getTransaction().commit();

Object_3 object3_1 = object4.getObjects3().get(0);