2012-07-01 36 views
1

最終目標:
有幾個java對象共享同一個基類持續到數據庫中,同時具有與所有擁有/繼承的對象其自身包含的表中的每一個,並通過數據庫ID簡單自動生成。冬眠簡單的繼承 - 或 - XML屬性導入/包括

非常簡單的要求。不可能(?)與Hibernate!

到目前爲止我什麼(使用MySQL,Hibernate XML映射):

map.hbm.xml

<?xml version="1.0"?> 

<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping default-access="field" 
    default-lazy="false"> 

    <class name="xyz.url.hibernate.EntityBase" abstract="true"> 
     <id name="m_id" column="id"> 
      <generator class="identity" /> 
     </id> 

     <version name="m_version" column="version" type="long" /> 

     <union-subclass name="xyz.url.hibernate.User" table="my_entity"> 
      <property name="name" column="name" type="string" /> 
     </union-subclass> 
    </class> 

</hibernate-mapping> 

EntityBase.java

public abstract class EntityBase { 
    private final long m_id; 
    private final long m_version; 

    public EntityBase() { 
     this.m_id = 0; 
     this.m_version = 0; 
    } 

    public long get_id() { 
     return this.m_id; 
    } 

    public long get_version() { 
     return this.m_version; 
    } 
} 

User.java

public class User extends EntityBase { 
    public String name; 
} 

上面沒有除非您將generator類更改爲increment
目前,這是給定的錯誤:

org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: xyz.url.hibernate.User 

那麼,爲什麼Hibernate的承擔,我想在程序範圍廣泛的唯一ID(我讀過的一些JPA要求)...什麼是扯淡!無論如何,我堅持要有一個簡單的表(每個對象)來聚合所有對象的(User在這種情況下)屬性,並且否定使用鑑別符(再次是一個廢話..),這隻會使最終的SQL查詢複雜化並且打擊表現。

唯一的解決方案,我在這裏看到:

  1. 手動在XML內的一個塊屬性映射。

  2. 映射所有屬性,同時從外部文件中「導入」一些<propert>項目,從而實現繼承(重新使用屬性)。可能?怎麼做?!?

  3. 進一步探索註釋,據我所見,他們不支持這種簡單的繼承要求。

  4. 轉儲休眠和去與另一個ORM解決方案。

請不要鏈接到文檔 - 我在閱讀了幾次後放棄了這個文檔!
屬性導入的示例(來自外部文件)會很好。

感謝上帝保佑!

回答

1

首先,您需要確定您的繼承關係是否應映射到數據庫(以允許多態查詢,如from EntityBase,多態realtionships等)或不。

據我瞭解你的情況它不應該被映射,因此根本不使用繼承映射選項,如<union-subclass>。現在您有以下選擇:

2. Hibernate沒有特別支持重用XML映射,但其文檔建議在這種情況下使用XML實體,例如,請參閱10.1.6. Table per concrete class using implicit polymorphism

3.註釋當然支持這種要求,形式爲@MappedSuperclass annotation。 此註釋可用於標記未映射到數據庫本身的類,但在其屬性上定義的任何映射註釋都會對其映射的子類生效,因此您不需要重複它們。

+0

一直工作在註釋選項,並發現你寫它。幸運的是,我從Hibernate中抽出了幾秒鐘。無論如何 - 謝謝! – Poni