簡體   English   中英

JPA實體可以從接口方法繼承@Version嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM