2013-02-04 32 views
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用於實現延遲引用
+0

當你簡單地調用'System.out.println(p.getParameter())'時,你認爲應該發生什麼?應該打印什麼? * Empty *'Parameter'對象(因爲它尚未加載)? Hibernate在這裏只是有點渴望。 –

+0

我期望在這裏顯示Id而不執行DB-Statement。代理應該知道自己的ID - 並且只有在「解析」任何其他屬性之前纔有Id。 – dpolaczanski

+0

是的,但不應該'toString()'(當調用println()')至少嘗試訪問所有屬性(不僅是'id'),從而觸發數據庫加載?我的觀點是,一旦你調用'getParameter()',Hibernate就會認爲你需要整個對象。顯然它不夠聰明。 –

回答

相關問題