我很難理解懶惰抓取,因爲我不工作,因爲我在書中讀到它,他們說在懶惰抓取jpa只會在它們被訪問時加載實體通過geters,所以我創建了一個Arquillian項目來測試這個概念,但它不起作用。 這裏有我的兩個實體爲什麼懶惰抓取不起作用JPA
人
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管理,所以我不應該得到該地址的人 問題是我可以獲取地址的人,即使我懶惰地址字段獲取和分離實體之前accessinbg地址字段! 請一定說明一下。
的其他測試
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
是的..你是對的..我很想知道爲什麼發生這件事。獲得更多信息。謝謝@achabahe –
@achabahe我懷疑這是原因,但是你用「hibernate」標記了你的問題,雖然它似乎沒有使用它。這是誤導。 –
可能是他試圖達到冬眠認識的人:D? @JBNizet^_^ –