簡體   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