繁体   English   中英

当分离在Eclipselink中未按预期工作时,对惰性(未加载)集合的JPA调用方法

[英]JPA call method on lazy (not loaded) collection when detached not working as expected in Eclipselink

最近我尝试了一点JPA,试图更多地理解整个框架。 我使用Eclipselink作为JPA提供程序。

我有两个实体,其中@OneToMany关系(一个人有很多地址)是延迟加载的。

当我加载一个人实体,分离它然后尝试访问(未加载)地址...它作为一个魅力。 调试时,我可以看到在执行地址列表的size()方法时执行了数据库查询。

我不明白为什么会有效。 我希望有某种例外。 我在最后几天(即这个链接 )已经阅读了很多关于jpa等的内容,但是所有内容都指出了我不应该工作的结论。

任何人都可以解释为什么有效吗?

@Stateless
public class Test {
    @PersistenceContext(unitName="TestPU") EntityManager em;

    public void test() {
        Person person = em.find(Person.class, 1);

        System.out.println(person);

        System.out.println("em.contains(person): " + em.contains(person);

        em.detach(person);

        System.out.println("em.contains(person): " + em.contains(person);

        person.getAddresses().size();

        System.out.println("em.contains(person): " + em.contains(person);

        System.out.println(person);

    }
}

结果日志将是

DEBUG: SELECT ... from PERSON WHERE (id = ?)
Person{id=1, name=Test, addresses={IndirectList: not instantiated}}
em.contains(person): true
em.contains(person): false
DEBUG: SELECT ... FROM ADDRESSES where (address_fk = ?)
em.contains(person): false
Person{id=1, name=Test, addresses={[Address{id=10, city=Testcity}]}}

如此处所述 detach会从上下文中删除实体,以便不再管理它。 由于上下文仍然可用,如果需要,仍然可以获取未触发的延迟集合,而EclipseLink认为这比抛出异常更有价值。 这被认为是EclipseLink的一项功能,并且JPA规范允许这样做,尽管其他提供程序默认情况下不启用该行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM