2011-10-10 76 views
1

我正在擴展一個不會自動生成其ID的實體。有沒有辦法來重寫繼承的生成策略?

我想在我的派生類中將其生成策略'重寫'爲AUTO。

就是這樣。

@Entity 
public class Base { 

    @Id 
    @Column(name = "id") 
    public Integer getId() { 
     return id; 
    } 

} 

@Entity 
public class Extender extends Base { 

    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Integer getId() { 
     return super.getId(); 
    } 
} 

這是我所得到的,當我嘗試這樣做:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Extender column: id (should be mapped with insert="false" update="false") 

我明白爲什麼會這樣,但我需要知道是否有這樣做的一種有效方式。

謝謝,

回答

2

這是不可能的,因爲您只能定義一次主鍵,並且GeneratedValue只能在主鍵定義的位置。而同樣從規格話:

2.4主鍵和實體標識
...主鍵必須完全一旦實體層級定義。

11.1.17生成值註釋
... GeneratedValue註釋可以與Id註釋一起應用於實體或映射超類的主鍵屬性或字段。

0

這看起來不正確。如果你想使用繼承您必須

  • 指定在基類@javax.persistence.Inheritance和選擇的策略的繼承是如何被映射(枚舉InheritanceType
  • 註釋類Base@javax.persistence.MappedSuperclass

也可以看一下注釋@javax.persistence.Transient,它使您可以在超類或超級接口中定義一個屬性,而不必在那裏指定映射。

我不喜歡在數據模型中繼承所有的開發者傾向於使用instanceof運營商,這將給在運行時意外的結果,如果你沒有你的實體類的實際實例,但一個Hibernate生成的代理對象(在延遲加載的情況下)。

+0

指定'javax.persistence.Inheritance'不是強制性的,默認是'SINGLE_TABLE'。我沒有在這裏包含所有的代碼,請假定它是正確的並且工作(除了@Id部分)。 – Simeon

+0

你的意思是我可以在我的基類id中指定'@ Transient',然後在派生類中進一步定義它? – Simeon

相關問題