Hibernate:覆盖实体获取器以添加注释
Posted
技术标签:
【中文标题】Hibernate:覆盖实体获取器以添加注释【英文标题】:Hibernate: override entity getter to add annotations 【发布时间】:2015-03-25 09:33:50 【问题描述】:我需要在它的超类中覆盖定义了 db 列的实体对象的 getter,因此我可以添加额外的注释。
例子:
@MappedSuperclass
public class Person
String name;
@Column(name = "name")
public String getName()
return name;
public void setName(String name)
this.name = name;
@Entity
@Table(name="employee")
@XmlType(name="employee")
public class Employee extends Person
@Override
@XmlAttribute(name = "name")
public String getName()
return super.getName();
Person
类包含多个实体的公共属性。 Employee
类扩展了 person 并定义了一个数据库表(表每类策略)。我还想将Employee
类序列化为 XML,因此我需要为其 getter 添加额外的注释,因此我将覆盖它们。
问题是,当我尝试运行此代码时,我得到一个 Hibernate MappingException
说:在 Employee 中找到名称的重复属性映射。
有没有办法告诉 Hibernate Employee 中的名称 getter 不是重复的,而是被覆盖(可能带有一些注释)。还是有其他方法可以满足我的需要?
【问题讨论】:
【参考方案1】:尝试将@Transient
添加到覆盖属性:
@Entity
@Table(name="employee")
@XmlType(name="employee")
public class Employee extends Person
@Override
@XmlAttribute(name = "name")
@Transient
public String getName()
return super.getName();
【讨论】:
写完这个问题后,我想到了这件事。我试过了,它似乎确实有效,但我不喜欢它,因为当属性上有一个@Transient 注释时,它实际上是持久的。但如果没有更好的办法,我会坚持这个解决方案。谢谢。 不幸的是,Java 方法覆盖也不适用于 JPA 元数据。 这仅适用于某些注释吗?我尝试做同样的事情来向子类添加@OrderBy
注释,但它似乎没有效果。【参考方案2】:
这是未经测试的代码,但我希望它能工作,像这样使用@AttributeOverride 注释
@Entity
@Table(name="employee")
@XmlType(name="employee")
@AttributeOverride(name = "name", column = @Column(name = "name"))
public class Employee extends Person
@Override
@XmlAttribute(name = "name")
public String getName()
return super.getName();
【讨论】:
以上是关于Hibernate:覆盖实体获取器以添加注释的主要内容,如果未能解决你的问题,请参考以下文章
[ SSH框架 ] Hibernate框架学习之四(JPA)
是否可以使用 Hibernate 验证注释对 DTO 类和实体进行注释?