我从另一个项目中包装以下类。它不应该使用Hibernate注释进行注释:
public class Response
{
private String access;
...
public String getAccess()
{
return this.access;
}
public void setAccess(String access)
{
this.access = access;
}
...
}
这是我当前项目中的“包装类”(用于持久性)。
但是,Response
超类的属性未映射。 (例如Access
)
(仅映射添加的属性entry_id
。)
@Entity
@Table(name = "ruleEngineResponse")
public class RuleEngineResponse extends Response
{
@Id
@Column(name = "entry_id")
private Long entry_id = -1L;
public void setId(Long entry_id)
{
this.entry_id = entry_id;
}
public Long getId()
{
return this.entry_id;
}
// Problem: this property is not mapped
@Column(name = "access")
@Override
public String getAccess()
{
return super.getAccess();
}
...
}
我如何配置RuleEngineResponse
来映射Response
超类的属性而不触及Response超类?
答案 0 :(得分:1)
此问题的典型解决方案是使用Response
注释@MappedSuperclass
。如果你不能这样做,你应该能够在orm.xml
中声明相同的内容,如下所示:
<mapped-superclass class = "Response" />
答案 1 :(得分:1)
它不起作用,因为一些注释被放置到字段,而其他注释被放置到属性。在JPA 2.0规范中,用以下词语告知:
访问类型为的实体层次结构中的所有此类 以这种方式违约必须保持一致 对字段或属性的注释,例如单个, 一致的默认访问类型适用于层次结构。
Hibernate的情况是,访问类型最终到 field ,因为@Id
注释被放置到字段。因此,getAccess
和其他方法中的注释也会被忽略。
如果要保留当前的类层次结构并且不想在RuleEngineResponse中再次定义变量access
,则注释应该是方法的位置:
@Entity
@Table(name = "ruleEngineResponse")
public class RuleEngineResponse extends Response {
private Long entry_id = -1L;
@Id
@Column(name = "entry_id")
public Long getId() {
return this.entry_id;
}
@Column(name = "access")
@Override
public String getAccess() {
return super.getAccess();
}
...
}
如果由于某种原因混合属性和字段访问是首选,可以使用@AccessType注释完成。您还可以考虑使用其他答案中建议的MappedSuperClass,但也必须解决注释放置中的冲突。