使用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,它只是一个持久性细节。
答案 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)