2011-02-15 42 views
0

我有兩個名爲Alpha和Beta的Hibernate實體,並且Alpha與Beta有*一對一的關聯。我想在數據庫中創建一個新的Alpha條目,引用一個現有的Beta。我有我想要關聯的Beta條目的主ID,但我沒有實際的實例。目前我儲存的Alpha這樣的(使用Spring的HibernateTemplate的):通過提供外鍵創建/更新Hibernate關聯

Alpha alpha = new Alpha(); 
alpha.setBeta(hibernateTemplate.load(Beta.class, betaId)); 
hibernateTemplate.save(alpha); 

我想,以避免不必首先加載測試版,但是,因爲它是一種不必要的查詢(我不需要alpha.getBeta ()來包含最新的附加實體 - 理想的情況是Hibernate應該用一個代理來替代它,就像延遲加載一樣)。於是,我嘗試了以下(記住,存在與betaId一個測試項):

Alpha alpha = new Alpha(); 
Beta beta = new Beta(betaId); 
alpha.setBeta(beta); 
hibernateTemplate.save(beta); 

這工作,但記錄顯示,休眠還是那張和查詢測試版在後端。更糟糕的是,如果該關聯配置了級聯,則空的Beta條目將覆蓋現有的條目。

那麼,有沒有什麼辦法通過只提供外鍵和Hibernate不必查詢關聯表來創建或更新這種關聯?理想情況下,我想複製這樣的SQL語句:

UPDATE alpha SET beta_id = :beta_id WHERE alpha_id = :alpha_id 

回答

0

HibernateTemplate.load()委託給Session.load(),因此它應該做的正是你想要的。啓用S​​QL日誌記錄以確保不會發出額外的查詢。

參見:

+0

出於某種原因,它的工作原理完全作爲一個測試程序說明,​​而不是在主應用程序。我會進一步調查,但HibernateTemplate.load()應該解決我所有的問題。謝謝。 – Zecrates 2011-02-15 10:54:22