繁体   English   中英

为什么延迟获取无法正常工作JPA

[英]Why Lazy Fetching is not working JPA

我很难理解懒惰的获取,因为我在书中读到它时并没有为此工作,他们说在懒惰的获取中,jpa仅在通过geters访问实体时才加载实体,因此我创建了一个Arquillian项目进行测试这个概念,但是行不通。 这是我的两个实体

package com.actionbazaar.model;

@Entity
@TableGenerator(
        initialValue = 5,
        name = "PERSON_SEQ",
        table = "PERSON_SEQ_TABLE",
        pkColumnName = "SEQ_NAME",
        pkColumnValue = "PERSON",
        valueColumnName = "SEQ_VALUE")
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String fname;
    private String lname;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.PERSIST)
    List<Address> addresses;
    //getters and setters 
}

地址

    @Entity
public class Address implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String city;
    private String zip;
    private String street;

    @ManyToOne
    private Person owner;
//getters and setters
}

我有这种方法的无状态会话bean

    public Person getFirstPerson() {
    Person p = em.find(Person.class, 1);
    em.detach(p);
    //why this call does not create an exception
    p.getAddresses().get(0);
    return p;
}

由于我在访问地址之前分离了该实体,因此地址列表应该为空,并且当我分离它时,它不再由entitymanager管理,因此我不应该为该人获取地址,问题是我可以获取该地址人甚至我都懒惰地获取地址字段并在访问地址字段之前分离了实体!!!! 请一些解释。

另一个测试

Person p= myStatlessSessionBean.getFirstPerson();
myOtherStalessSesionBean.moveAllPeopleToCity("NY");
if(p.getAddresses().get(0).getCity().equals("NY"))
{
  system.out.prinln("person moved");
}
else {
system.out.prinln("person did not move");
} //prompts person did not move

是的,哥们,你是对的。 您在这里没有做错任何事情。 我刚刚打开Pro JPA 2第二版Book ,发现了以下内容:

这是快照

您正在使用嵌入玻璃鱼,这实际上是导致问题的原因。 您的代码没有问题。 正如上述书的作者所提到的,

一些供应商可能尝试解决关系,而其他供应商可能只是抛出异常或使属性未初始化。

因此,在您的情况下,关系得到解决而不是延迟加载。 只需使用其他供应商实施相同的示例,您就不会遇到任何问题。 在这里使用嵌入的玻璃鱼, 无法进行lazyfetch 否则应抛出异常,因为变量p已分离。

这里是链接在那里我也看到这个美丽的资料片

这是上面链接的快照 快照

您仅分离父实体Person。 您没有分离子实体,即地址,当您获得地址时,它是指仍由持久性上下文管理的实体。

如果还希望将子代分离,则应使用CascadeType.DETACH。

您可能会说:“但是我的FetchType设置为LAZY!”。 仅仅因为它是LAZY,并不意味着该对象为null。 Hibernate返回集合类型的Proxy对象,一旦尝试访问它们,它将填充它们的值。

暂无
暂无

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

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