簡體   English   中英

為什么 Hibernate.isPropertyInitialized 返回 true?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM