2016-10-06 44 views
0

休眠繼承映射,我一個有一個接口:與接口父使用Groovy和Hibernate 4.3

interface PaymentMethod { 

} 

一個實現:

class Salary implements PaymentMethod { 

    private Long id 

    private Integer value; 

    protected Salary() {} 

    public Salary(Integer value) { 
     this.value = value 
    } 

    Integer getValue() { 
     return value 
    } 
} 

以下配置:

<class name="sandbox.payroll.PaymentMethod" abstract="true"> 
    <id name="id" column="ID"> 
     <generator class="sequence"/> 
    </id> 

    <union-subclass name="sandbox.payroll.imp.Salary" table="SALARY"> 
     <property name="value" type="java.lang.Integer" column="VALUE" access="field"/> 
    </union-subclass> 
</class> 

並將hibernate.hbm2ddl.auto設置爲hsqldb內存模式中的創建 - 刪除。

當我運行一個測試時,我得到一個org.hibernate.PropertyNotFoundException: field [id] not found on sandbox.payroll.PaymentMethod。基於Hibernate文檔的映射似乎很好,我不明白哪裏出了問題。任何提示?

UPDATE

1)發電機必須是在這種情況下的序列。

2)我可以通過在界面上定義getId和setId來實現它,但我不想這樣做,因爲它對於域設計是不必要的,它包含一個包含PaymentMethod專業化:

class Employee { 

    PaymentMethod paymentMethod 

    (...) 
} 

它是一個一對一relantionship其中僱員是所有者,所以付款方法的ID是不相關的,因爲它是相同的僱員的。因此,對於域模型,PaymentMethod不需要公開任何id,它只是一個持久性細節。

回答

0

鑑於上述內容,您似乎試圖告訴Hibernate在sandbox.payroll.PaymentMethod處尋找名爲id的屬性/屬性,該屬性不包含此屬性/屬性。所以,在這種情況下,一個簡單的解決方法是將getId/setId添加到sandbox.payroll.PaymentMethod,我認爲這是你不想做的事情。

您能否更深入地瞭解您真正想要實現的目標?鑑於Hibernate documentation about inheritance中描述的內容,似乎應該爲<union-subclass />聲明id,而不是在<union-subclass />節點之外聲明,正如您在此嘗試的那樣。

您是否試圖讓抽象類聲明一個包含此id的東西,並避免每重複聲明<union-subclass />

+0

聯盟 - 子不工作,即使我的子類來定義的id屬性休眠抱怨說,付款方法應該有一個ID,儘管連我聲明它抽象的事實。我認爲我想達到的目標是不可能的。 – VitorCruz