2009-01-04 91 views
3

我有以下Hibernate映射,其具有使用每個具體類層次結構的表被映射:表在休眠

<hibernate-mapping package='dao'> 
    <meta attribute='class-description'></meta> 
    <class name='PropertyDAO'> 
     <id name='id' column='id_property'> 
      <generator class='assigned'/> 
     </id> 
     <property name='address' column='address' type='string'/> 
     <union-subclass name='HouseDAO' table='house'> 
      <property name='noOfRooms' column='noOfRooms'/> 
      <property name='totalArea' column='totalArea'/> 
      <property name='price' column='price'/> 
     </union-subclass> 
     <union-subclass name='LandDAO' table='land'> 
      <property name='area' column='area'/> 
      <property name='unitPrice' column='unitPrice'/> 
     </union-subclass> 
    </class> 
</hibernate-mapping> 

在數據庫中,這意味着我僅具有2個表:

  • 房子(id_property(PK),地址,noOfRooms,totalArea,價格)
  • 土地(id_property(PK),地址,面積,單價)

據我所知,在這種情況下,ids需要在調用.save()之前顯式生成,所以我的問題是:如何創建自動生成ID的策略,以便從具體類在連接時形成一個連續的域。

回答

0

的解決方案是創建另一個表,用於存儲下一個ID;每次用戶想要插入新實體時都應修改此值。通過這種方式,域名是連續的

1

我用連接子類

<key column="id"/> 

以下這應該使子類使用的ID從屬性表,因爲這是它依賴。 (super)該列引用了子類中對super的外部引用的列。

+0

你的解決方案對於每個子類層次結構的表是好的,但這不是我的情況,因爲我只有2個表:房子和土地 – melculetz 2009-01-04 09:29:25

3

恕我直言,你的模型在數據庫中是錯誤的,因爲你有相關的多個表中的冗餘信息。

每個具體類的表是一個繼承模型,它會在運行時給出問題,因爲您可能會遇到這樣的情況,即在它們相同(語義上)時更新Land的地址而不是House的地址。 Iow:放棄這個模型並引入每個子類的表,因此你有一個帶有ID和地址的屬性基表和兩個分開的表,PK是屬性基的PK,FK是一個房子,一個房子是房子的特定字段另一個是具有土地特定領域的土地。

這會給你的問題數量最少,因爲它的轉換實體類型爲關係表(見Nijssen /哈爾平的約NIAM/ORM書籍)之間的繼承方式

+0

非常感謝,但不幸的是我無法改變數據庫結構,所以我正在尋找一個針對每個具體類模型的表的解決方案 – melculetz 2009-01-04 12:44:17