最近我尝试了一点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);
}
}
Run Code Online (Sandbox Code Playgroud)
结果日志将是
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}]}}
Run Code Online (Sandbox Code Playgroud)