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:覆盖实体获取器以添加注释的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 使用注释

[ SSH框架 ] Hibernate框架学习之四(JPA)

是否可以使用 Hibernate 验证注释对 DTO 类和实体进行注释?

Hibernate - 是不是需要在父实体中包含 Set 和 OneToMany 注释?

Hibernate @Column 注释不起作用

Hibernate---数据操作示例BY实体类注释