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关闭后访问惰性关系的支持,我对此没有问题,因为我认为这是一个优势。。。我只想确保,如果我不访问惰性关系,它不会加载到内存中,而且显然不会发生这种情况,因为即使在关闭工厂之后(在我的示例中,这是唯一的),家族实例仍然能够访问其成员,如上所述,在关闭工厂之前,我没有访问任何一个工厂:(非常感谢您的帮助,我已经阅读了您的