2014-10-18 79 views
2

在我正在處理的Spring/Hibernate項目上,我注意到要在數據庫中保留一個新對象,使用了一個自動佈線的實體。簡化的,它是做這樣的事情:Hibernate實體應該自動裝配還是「手動」實例化?

@Service 
public class SomeArbitraryManager { 
    @Autowired private SomeArbitraryItem item; // The Hibernate entity. 
    @Autowired private SomeArbitraryDao dao; // The corresponding DAO. 

    public void arbitraryMethodThatNeedsToStoreAnItem(long someId, String someValue) { 
     item.setPropertyA(someId); 
     item.setPropertyB(someValue); 
     item.setPropertyC(new Date()); 
     dao.save(item); 
    } 
} 

如前所述,這是簡化的理念,在實踐中出現了更多的屬性,不同的方法做插入和錯誤處理。現在,一個錯誤發生在Hibernate實際上只是覆蓋最後插入的行。我相信這是由於SomeArbitraryItem在Hibernate插入它後接收到一個id(對於主鍵),並且Hibernate在保存相同項目時假定更新。另一種情況是,插入的對象的屬性並未全部更新,因此SomeArbitraryItem被插入,其中一些字段包含最後插入的值。

我問爲什麼不只是用於各插入一個新的SomeArbitraryItem,就像這樣:

SomeArbitraryItem item = new SomeArbitraryItem(); 
    ... // Set properties. 
    dao.save(item); 

這是將是有意義的我,因爲如果它是一個新的(數據庫)的對象,不應該這也是一個新的常規,Java,對象?當我問的時候給我的答案是,當使用DI時,你不應該創建對象。

我已經谷歌搜索看到這是什麼政策,但我找不到任何東西。有噸的Spring/Hibernate教程,但我沒有看到Hibernate實體在那些自動裝配。但是,它們可以簡化,因爲它們只是教程。

所以:應該怎麼做? Hibernate實體應該是自動裝配的嗎?他們是否應該被實例化?或者,爲了不把我們綁定到特定的類,我們是否應該每次從Spring應用程序上下文中獲取一個新的?還有別的嗎?

(爲了強調:我不是在尋找所使用的方法的副作用的解決方案我問,如果它的原理是在視圖Spring和Hibernate的正確。)

回答

2

你應該只有線類將爲當前整個班級提供特定的功能。由Hibernate(或任何其他ORM框架)管理的實體類不符合此類要求,您應該使用new關鍵字創建它,否則它們將作爲從數據源中查找數據的結果而創建,因此它們不應由Spring管理也沒有任何其他DI框架。

+0

謝謝你,你的回答對我有意義。如果你碰巧知道任何文件來支持它,並且可以添加那些更值得讚賞的文件。我真的希望得到更多的迴應這個問題和更多的投票你的評論作爲一個確認,但無論如何這是一個令人滿意的答案在我心中。 – 2014-10-25 21:22:02

+1

沒有文件。這只是經驗。 – 2014-10-25 22:09:30

+0

我試圖成爲'正確的'。就我個人而言,我只需要你的45.2k聲望單詞。 ;) – 2014-10-25 22:13:46