2009-07-01 66 views
0

我對Hibernate相對比較新,並且正在嘗試將一個相對簡單的現有數據庫遷移到可與Hibernate一起使用的某些內容,並且正在尋找關於如何構建我的應用程序的建議。在Hibernate中的查詢多態性

我有3種類型的實體:

  • 項目
  • 類別
  • 屬性類型

項目和類別和屬性類型都是相似的;他們都有一個名稱,描述,創建日期等,但他們每個人都有不同的附加功能:

  • 項目都有一個具體的位置(URL)
  • 類別包含組項目和/或類別的,在類別和項目之間的多對多關聯以及從父類別到子類別的鄰接列表。
  • 屬性類型是鍵/值字段的屬性表的使用與項目,類別或其他PropertyTypes

現在我有項目和類別在不同的表中定義相關的元數據的關鍵,但我想知道是否明智的做一個抽象的節點實體類的項目和類別是子類。 PropertyType不同,它可能應該存在於自己的表中。 (我只有3個Property的屬性,其中一個PropertyType應用於另一個PropertyType,如果它使事情變得更容易,可能會拋棄它們,因此PropertyType始終適用於節點)。

目前,我的Property表包含PropertyTypeId,ID(屬性適用的Item,Category或PropertyType的ID),id_context(以前字段的鑑別符:0 = Item,1 = Category,2 = PropertyType)和值(任意字符串)。

具體的問題:

  1. 如果我想保持我現有的表結構(例如項目和類別有不同的表),我怎麼告訴Hibernate使用來確定物業類型的id_context鑑別?我是否必須將Item/Category/PropertyType作爲共同祖先的子類,以便當我將Property對象與給定的PropertyType關聯時,它可以返回包含Item或Category的列表?

  2. 我應該使用Hibernate嗎?我知道如何讓SQL查詢做我想做的事情,我只是想着如何在它周圍包裝Hibernate。

  3. 我需要做些什麼來推動Hibernate做我想要的查詢?例如如果我只是想返回屬性記錄,其中PropertyType是258,適用於類別對象(id_context = 2),我知道如何在SQL(SELECT * FROM屬性WHERE PropertyType = 258 AND id_context = 2)中做到這一點,但我不知道當然如何在Hibernate中做到這一點。

+0

是您計劃使用Hibernate XML映射文件還是註釋? – 2009-07-01 17:11:48

回答

1

你想要的外鍵引用和外鍵方面的鑑別器列當前不被hibernate支持。一個真正的Hibernate-aholic可能會爭辯說,它不是一個健全的關係模型,因爲你不能定義一個外鍵約束。要使用Hibernate建模,你必須合併所有三種實體類型,或者有兩個單獨的列,一個引用Item/Category(它將被統一),一個引用PropertyType:基本上分解PropertyType類兩個不相關的子類。

你基本上必須改變你的整個數據庫設置以適應Hibernate。

有理由轉移到Hibernate,然後'透明'ORM。我認爲你應該在應用程序的其他地方看看Hibernate是否適合它:你面臨什麼問題?你想要Hibernate來解決什麼問題?有跡象表明,Hibernate提供,可能是有益的許多功能: - 延遲加載 - 延遲寫入(只寫DB時TX承諾) - 第一和第二級緩存 - ...

乾杯