2015-03-25 70 views
2

我需要重写一个实体对象的getter,在它的超类中定义了db列,所以我可以添加额外的注释。休眠:重写实体获取器来添加注释

实施例:

@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添加额外的注释,因此我重写了它们。

问题是,当我尝试运行此代码时,我得到一个休眠MappingException说:在Employee中找到名称的重复属性映射。

有没有办法告诉Hibernate,Employee中的名字getter不是重复的,而是重写(可能带有一些注释)。还是有另一种方法来做我所需要的?

回答

2

尝试增加@Transient到重写属性:

@Entity 
@Table(name="employee") 
@XmlType(name="employee") 
public class Employee extends Person { 

    @Override 
    @XmlAttribute(name = "name") 
    @Transient 
    public String getName() { 
     return super.getName(); 
    } 

} 
+0

这个确切的事情来到我的脑海后我写完这个问题。我试过了,它似乎工作,但我不喜欢它,因为它看起来很混乱,因为实际上持久化的属性上存在@Transient注解。但如果没有更好的东西出现,我会坚持这个解决方案。谢谢。 – Jardo 2015-03-25 09:48:01

+0

不幸的是,Java方法重写并不适用于JPA元数据。 – 2015-03-25 09:49:42

0

这是未经测试的代码,但我希望它会正常工作,使用@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(); 
    } 

} 
+0

这不起作用。我得到同样的例外。 – Jardo 2015-03-25 11:54:28