Jpa 对延迟加载感到困惑吗

Jpa 对延迟加载感到困惑吗,jpa,lazy-loading,eclipselink,Jpa,Lazy Loading,Eclipselink,在尝试对延迟加载进行一些测试时,为了检查我是否理解得很好,我完全弄糊涂了 以下是我在测试中使用的实体: @Entity public class Family { @Id private int id; @OneToMany(mappedBy="family", fetch=FetchType.LAZY) private Set<Person> members; //getters & setters public String toString(){ Str

在尝试对延迟加载进行一些测试时,为了检查我是否理解得很好,我完全弄糊涂了

以下是我在测试中使用的实体:

@Entity
public class Family {
@Id
private int id;


@OneToMany(mappedBy="family", fetch=FetchType.LAZY)
private Set<Person> members;

//getters & setters

public String toString(){
    String s="";
    for(Person p:getMembers()){
        s+=p.getFirstName();
    }
    return s;
}
}

@Entity
public class Person implements Comparable<Person>{
@Id
private int id;

private String firstName;
private String lastName;

@ManyToOne
private Family family;

//getters &setters
}
@实体
公营家庭{
@身份证
私有int-id;
@OneToMany(mappedBy=“family”,fetch=FetchType.LAZY)
私有集合成员;
//接球手和接球手
公共字符串toString(){
字符串s=“”;
for(Person p:getMembers()){
s+=p.getFirstName();
}
返回s;
}
}
@实体
公共类人员实现可比性{
@身份证
私有int-id;
私有字符串名;
私有字符串lastName;
@许多酮
私人家庭;
//接球手和接球手
}
以下是我的主要方法:

public static void main(String[] args) {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    em = factory.createEntityManager();

    Query q = em.createQuery("select f from Family f");
    List<Family> families= q.getResultList();

    em.clear();
    em.close();
    factory.close();

    for(Family f:families){
        System.out.println(f);
    }
}
publicstaticvoidmain(字符串[]args){
factory=Persistence.createEntityManagerFactory(Persistence\u UNIT\u NAME);
em=factory.createEntityManager();
Query q=em.createQuery(“从族f中选择f”);
List families=q.getResultList();
em.clear();
em.close();
工厂关闭();
家庭(f:家庭){
系统输出打印ln(f);
}
}
我从延迟加载中了解到,如果一个属性被标记为延迟获取,并且在它被管理时没有被访问,那么它就不会被加载到内存中,以后任何访问它的尝试都不会起作用。现在让我困惑的是,上面描述的测试在通过分离的族列表访问lazy members属性时没有任何问题,即使在关闭EM和EMF之后也是如此。。。这正常吗?我不理解延迟加载的概念吗?

注意:我使用的是带有嵌入式数据库的J2SE环境。我的提供者是EclipseLink

提前感谢

George

这可能是因为JPA提供程序不需要使用延迟初始化。这不是JPA提供商必须满足的要求,而是


当指定了
FetchType.EAGER
时,JPA需要急切地获取数据,但当指定了
FetchType.LAZY
时,JPA不需要惰性地获取数据。

这可能是因为JPA提供程序不需要使用惰性初始化。这不是JPA提供商必须满足的要求,而是


当指定了
FetchType.EAGER
时,JPA需要急切地获取数据,但当指定了
FetchType.LAZY
时,JPA不需要惰性地获取数据。

请确保您使用的是eclipselink代理或静态编织。如果你两者都不使用,那么懒惰就不会被编织,你就会有渴望

此外,EclipseLink还支持在EntityManager关闭后访问惰性关系。
虽然不是在工厂关闭后。但是,如果对象在缓存中,那么它也可能在关闭后工作。此外,如果在同一个持久性单元上有另一个工厂处于打开状态,则该持久性单元仍然处于打开状态。

请确保您使用的是eclipselink代理或静态编织。如果你两者都不使用,那么懒惰就不会被编织,你就会有渴望

此外,EclipseLink还支持在EntityManager关闭后访问惰性关系。
虽然不是在工厂关闭后。但是,如果对象在缓存中,那么它也可能在关闭后工作。此外,如果在同一个持久性单元上有另一个工厂处于打开状态,则持久性单元仍然处于打开状态。

请检查在工厂关闭之前是否未触发toString方法,例如,如果实体正在被记录。我不建议在toString方法中触发关系,因为这很容易出错,并且可能会意外触发。启用EclipseLink日志记录将有助于显示在工厂生命周期中访问它的位置,前提是它不是问题的一部分。

检查在工厂关闭之前是否未触发toString方法,例如是否正在记录实体。我不建议在toString方法中触发关系,因为这很容易出错,并且可能会意外触发。启用EclipseLink日志记录将帮助您了解在工厂的生命周期中访问它的位置,假设这不是问题的一部分。

谢谢您的回答。我忘了告诉我我的JPA提供商是EclipseLink,它支持延迟加载AFAIK。谢谢你的回答。我忘了告诉我,我的JPA提供商是EclipseLink,它支持懒加载AFAIK。我在中发现了一个类似的问题,并且有一个答案(一个名为James的成员也发布了一个巧合:-)说“实际上,只有懒的OneToOne才需要编织,而懒的OneToOne/ManyToOne将在OneToMany中工作而不需要编织。”,关于在EntityManegr关闭后访问惰性关系的支持,我对此没有问题,因为我认为这是一个优势。。。我只想确保,如果我不访问惰性关系,它不会加载到内存中,而且显然不会发生这种情况,因为即使在关闭工厂之后(在我的示例中,这是唯一的),家族实例仍然能够访问其成员,如上所述,在关闭工厂之前,我没有访问任何一个工厂:(我在中发现了一个类似的问题,并且有一个答案(一个叫James的成员也发布了一个巧合:-)说“实际上编织只对懒惰的OneToOne是必需的。许多懒惰的OneToOne将在OneToMany工作而不编织。”,关于在EntityManegr关闭后访问惰性关系的支持,我对此没有问题,因为我认为这是一个优势。。。我只想确保,如果我不访问惰性关系,它不会加载到内存中,而且显然不会发生这种情况,因为即使在关闭工厂之后(在我的示例中,这是唯一的),家族实例仍然能够访问其成员,如上所述,在关闭工厂之前,我没有访问任何一个工厂:(非常感谢您的帮助,我已经阅读了您的