1
我在Product和Parameter之間有一個單關係。 (JavaAssistant用於實現延遲引用,代碼在Spring-Container中執行)。jpa - 爲什麼惰性引用id的getter執行DataBase語句
@Entity
public class Product extends AbstractEntity {
@javax.persistence.ManyToOne(fetch = FetchType.LAZY)
@javax.persistence.JoinColumn(name = "parameterID")
private Parameter parameter;
...
}
現在我exceute:
1. Product p = em.find(Product.class, 1L);
2. System.out.println(p.getParameter().getId())
並在日誌中我可以看到:
select ... **product1_.parameterID** as paramet11_38_ ... from Product product1_ where product1_.id=?
select parameter0_.id as id49_0_ ... from Parameter parameter0_ where parameter0_.id=?
爲什麼JPA的第二行執行的查詢,當它知道參數的ID(因爲它讀取在第一行)? 它應該在詢問除id以外的其他屬性時執行查詢。你不覺得嗎? 爲什麼它的行爲如此?我們可以強迫Hibernate採取不同的行爲嗎?
環境:
- 休眠3.6.10作爲JPA提供
- 春3.1.0
- JavaAssistant用於實現延遲引用
當你簡單地調用'System.out.println(p.getParameter())'時,你認爲應該發生什麼?應該打印什麼? * Empty *'Parameter'對象(因爲它尚未加載)? Hibernate在這裏只是有點渴望。 –
我期望在這裏顯示Id而不執行DB-Statement。代理應該知道自己的ID - 並且只有在「解析」任何其他屬性之前纔有Id。 – dpolaczanski
是的,但不應該'toString()'(當調用println()')至少嘗試訪問所有屬性(不僅是'id'),從而觸發數據庫加載?我的觀點是,一旦你調用'getParameter()',Hibernate就會認爲你需要整個對象。顯然它不夠聰明。 –