[英]Why Hibernate.isPropertyInitialized returns true?
我有一個 Person class,它有一個名為 autos 的惰性初始化集合。 從數據庫中獲取人員后,我調用了兩個名為 isInitialized(autos) 和 isPropertyInitialized(personObject,autos) 的 hibernate 方法,第一個顯示為 false,第二個顯示為 true。 為什么?
@Entity
public class Person {
@OneToMany(mappedBy="person",fetch=FetchType.LAZY)
private List<Auto> autos;
}
@Entity
public class Auto {
@ManyToOne
@JoinColumn(name = "person_id", nullable = false)
private Person person;
}
測試代碼:
Person p = personRepository.findAll().get(0);
System.out.println(Hibernate.isInitialized(p.getAutos()));
System.out.println(Hibernate.isPropertyInitialized(p,"autos"));
安慰:
false
true
我相信在這種情況下使用Hibernate.isPropertyInitialized
可能不正確。
根據文檔Hibernate.isPropertyInitialized
應該用於驗證屬性或 state 的惰性,例如Person
object 的"name"
。 為了驗證子實體的惰性,應該使用Hibernate.isInitialized
boolean personInitialized = Hibernate.isInitialized(person);
boolean personBooksInitialized = Hibernate.isInitialized(person.getBooks());
boolean personNameInitialized = Hibernate.isPropertyInitialized(person, "name");
或者最好像文檔javax.persistence.PersistenceUtil.isLoaded
中提到的那樣
PersistenceUtil persistenceUnitUtil = Persistence.getPersistenceUtil();
boolean personInitialized = persistenceUnitUtil.isLoaded(person);
boolean personBooksInitialized = persistenceUnitUtil.isLoaded(person.getBooks());
boolean personNameInitialized = persistenceUnitUtil.isLoaded(person, "name");
現在為什么有Hibernate.isPropertyInitialized
以及為什么它總是返回true
我相信主要原因是字節碼增強和延遲屬性加載。
通常在獲取實體時會加載所有屬性,例如"name"
、 "age"
等。
獲取實體時,所有屬性也將被加載。 這是因為每個實體屬性都隱式標記有@Basic 注釋,其默認獲取策略為 FetchType.EAGER。 資源
但是,通過 Bytecode 增強,我們可以定義哪些屬性應該是惰性的。 當我們有一些大型屬性(如 blob 圖像)時,這很有用。 我相信對於這種特殊情況,我們需要Hibernate.isPropertyInitialized
為什么在你的情況下它總是返回true
。 如果我們查看 Java Doc 的方法,我們可以看到它期望
@param proxy The potential proxy
如果它是HibernateProxy
,那么將檢查它是否未初始化。 如果是,您將收到false
,因為對於代理惰性,所有屬性都被急切地初始化,因此代理未初始化,那么屬性也是如此。 另一方面,我們有一個聲明
@return true if the named property of the object is not listed as uninitialized; false otherwise
因此,在您的情況下,您沒有使用惰性屬性獲取機制,也沒有傳遞代理 object 因為Person
已經初始化。 無法檢查屬性是否列為未初始化,因此返回true
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.