[Java] Hibernate與iBATIS


Answers

考慮你想要達到的目標。 通常, 命令查詢響應隔離模型適用於復雜的域。

原因是你試圖通常做兩件事之一:

  1. 創建/更新/刪除一些複雜的域實體
  2. 運行分析抓取查詢(即求和/聚合查詢)

Hibernate可以很好地處理案例1,讓您只需創建一個POJO並堅持/更新它。 除非你的域名相當大,否則它也會很快做到這一點。

myBatis非常適用於提取查詢(情況2),您只需要一個答案。 Hibernate將嘗試加載整個對像圖,並且您需要使用LazyLoading技巧開始調整查詢以使其在大型域中工作。 相反,如果你只是想要一些分析POJO頁面,相同查詢的myBatis實現將是微不足道的。

正因為如此,在SELECTS,myBatis 比Hibernate更快

這兩種情況是您想要更改域數據的命令與只想獲取某些數據的響應之間的區別。

因此,請考慮這兩種情況以及您的應用程序的功能。 如果你有一個簡單的域,只需獲取信息,請使用myBatis。 如果你有一個複雜的域和堅持實體,使用Hibernate。 如果你們兩個都做,就考慮一種混合方法。 這就是我們在我們的項目上使用的項目,它有數千個實體來控制它。 ;)

Question

對於我們的新產品重新設計,我們正在從Java中選擇最佳框架。 考慮到模型的數據庫不可知方法,我們正在研究Struts + Spring與iBATIS或Hibernate之間的選項。 請建議這是最好的,因為兩者都提供持久性。




如果你已經在使用Spring,我將從Spring JDBC開始,而不是直接進入Hibernate或iBatis。 如果你使用接口編寫持久層,那麼在你將Hibernate或iBatis帶到你的帶子之後,你應該沒有問題。

沒有理由為什麼它必須是“全部或不是”的決定。 使用最適合你的情況。




ORM與持久性框架

Hibernate是將Java類映射到數據庫表的對象關係映射框架(ORM)。 MyBatis是持久性框架 - 而不是ORM。 它將SQL語句映射到Java方法。

數據庫架構

Hibernate可以根據你的Java模型創建數據庫模式,而MyBatis沒有這樣的特性。 相關討論:

高速緩存

Hibernate具有不可能禁用的第一級緩存。 這意味著如果您通過ORM查詢項目,然後直接使用SQL刪除項目,它將保留在緩存中。 您可以明確清除緩存以從數據庫獲取最新的結果。 相關討論:

樂觀鎖管理

樂觀鎖管理也存在差異:

與帶有@Version註釋的Hibernate / JPA等ORM工具不同,MyBatis本身不支持樂觀並發控制。

相關討論:

延遲加載

Hibernate會嘗試加載整個對像圖,但標記為延遲加載的對象除外。 myBatis將根據SQL查詢加載數據。 延遲加載可能會提高性能,但如果它與<property name="hibernate.enable_lazy_load_no_trans" value="true" />屬性一起使用,可能會導致連接洩漏。 相關討論:

Hibernate會話管理

通過Hibernate Session執行保存,更新或刪除等實體操作。 它需要很好地理解如何實施適當的Hibernate會話管理策略,以避免detached entity passed to persist Hibernate相關的detached entity passed to persist和其他現象。

有時可能需要更多時間來理解潛在的Hibernate行為,而不是增加一點點工作並為myBatis編寫原始SQL語句。

級聯

Hibernate為對像圖提供級聯,孤立刪除和其他功能,但它們不出現在myBatis中 - 要實現它們,您需要明確編寫SQL查詢。

查詢

在myBatis中,您將編寫幾乎普通的SQL查詢。 Hibernate有多種選項來形成查詢:SQL,HQL,Criteria API。 有時,如果標準中有許多可選字段,則可以使用Criteria API。 它將提供更加結構化的方法來形成查詢並避免相關錯誤。