[英]Can JPA entity inherit @Version from an interface method?
我定義了一個Versioned
接口,期望我可以在任何我希望使用JPA版本控制功能的持久化實體上實現它(例如,比較版本用於空中碰撞,自動遞增更新)。
public interface Versioned {
@Version
int getRevision();
}
這不會節省太多(如果有的話)編碼,但它也為我提供了一個標記界面,我稍后計划。
public class Foo implements Versioned {
private int revision;
@Override
public int getRevision() {
return revision;
}
}
方法允許@Version
,我希望Foo從Versioned
接口繼承該特性。 情況似乎並非如此。 我可以在數據庫中更新我的Foo
實例,但修訂版號不會自動更改。
但是,如果我在實現中添加@Version
注釋,它將按預期工作:
@Version
private int revision;
我沒有被卡住 - 我可以獲得我需要的功能。 我只是好奇:是否有一個“技巧”讓這個與界面的方法上的注釋正常工作? 或者有人可以指出我為什么這不起作用的記錄?
注釋繼承不適用於方法。 來自@Inherited
的文檔 :
請注意,如果使用帶注釋的類型來注釋除類之外的任何內容,則此元注釋類型不起作用。 另請注意,此元注釋僅導致注釋從超類繼承; 已實現接口上的注釋無效 。
我很確定這是不可能的。
首先,因為需要@MappedSuperclass來繼承超類中的映射注釋。 所以我不明白為什么映射注釋會自動從接口繼承。
其次,因為如果類中的JPA anotations在字段上而不在getter上,則getter上的注釋將被忽略。
規范第2.11.2段說:
實體可以從提供持久實體狀態和映射信息的超類繼承,但它本身不是實體。 通常,這種映射的超類的目的是定義多個實體類共有的狀態和映射信息。
與實體不同,映射的超類不可查詢,不能作為參數傳遞給EntityManager或Query操作。 映射的超類定義的持久關系必須是單向的。
抽象類和具體類都可以指定為映射的超類 。 MappedSuper-類注釋(或mapped-superclass XML描述符元素)用於指定映射的超類。
(強調我的)
這是關於繼承的章節,並且沒有關於從接口繼承映射的spec talsk。 映射只能從抽象類或具體類繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.