2015-03-25 61 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