我有一个问题,当我们有像 Select DISTINCT A from A a left join fetch a.b 这样的查询时 JPA 将填充对象 A,并预取与 a 为 oneToMany 关系的对象 b。预取到底意味着什么,因为当我调试这个对象时它有空值,并且数据库中有数据,所以我假设它是一个代理对象。代理是否包含从数据库预取的任何数据,并且只有当我实际调用 a.getB().size() 这样的方法时,它才会填充到 a.b 上?
我认为如果我使用“left join fetch”我就不需要调用a.getB().size(),但是如果我不这样做,对象b将保留作为代理,然后在表示层中如果任何对象调用b的任何属性,就会有一个空指针。
我还可以补充一点,这个 b 对象被映射为延迟加载,这就是我毕竟使用 fetch 的原因。 :) 另外,即使我使用“left join fetch”并调用 a.getB().size(),它也不会执行任何其他查询,对吧?预取将负责获取 b 的所有数据,...它只需要我调用一个方法,以便将数据从代理传输到实际对象?
提前感谢您的任何解释,这真的很困扰我......
最佳答案
这取决于您的 JPA 实现。
据我所知,至少对于 EclipseLink,如果您使用连接获取,该属性将始终被实例化,永远不会为 null。
关于java - 左连接获取和预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520778/