Hibernate继承映射与父接口

时间:2016-10-06 14:30:30

标签: xml hibernate groovy interface mapping

使用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内存架构中设置为create-drop。

当我进行测试时,我得到org.hibernate.PropertyNotFoundException: field [id] not found on sandbox.payroll.PaymentMethod。根据Hibernate文档,映射似乎没问题,我无法理解出了什么问题。任何提示?

更新

1)在这种情况下,发电机必须是顺序。

2)我能够通过在界面上定义getId和setId来使其工作,但我不想这样做,因为域设计是不必要的,域设计包含一个包含PaymentMethod专门化之一的Employee :

class Employee {

    PaymentMethod paymentMethod

    (...)
}

这是一个一对一的关系,其中Employee是所有者,因此PaymentMethod的ID是无关紧要的,因为它与Employee相同。因此,对于域模型,PaymentMethod不需要公开任何id,它只是一个持久性细节。

2 个答案:

答案 0 :(得分:0)

鉴于所描述的内容,您似乎试图告诉Hibernate在id查找名为sandbox.payroll.PaymentMethod的属性/属性,该属性/属性不包含此类属性/属性。因此,在这种情况下,一个简单的解决方法是将getId / setId添加到sandbox.payroll.PaymentMethod,我认为这是您不想做的事情。

你能否更深入地了解一下你真正想要实现的目标?鉴于Hibernate documentation about inheritance中描述的内容,似乎应该为每个id声明<union-subclass />,而不是在<union-subclass />节点之外,正如您在此处尝试的那样。

您是否尝试使用声明包含此id的抽象类,并避免为每个<union-subclass />重新声明它?

答案 1 :(得分:0)

发生这种情况是不可能的。在Hibernate(5.2)的最后一个文档中,标识符部分说(粗体是我的):

  

“每个实体必须定义标识符。对于实体继承层次结构,&gt;标识符必须仅在作为&gt; <的根的实体上定义强>层级“。

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers