JPA实体可以从接口方法继承@Version吗?

时间:2013-04-05 13:53:04

标签: java inheritance jpa annotations

我定义了一个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;

我没有被卡住 - 我可以获得我需要的功能。我只是好奇:是否有一个“技巧”让这个与界面的方法上的注释正常工作?或者有人可以指出我为什么不能按照我的预期工作的文件?

2 个答案:

答案 0 :(得分:3)

注释继承不适用于方法。来自documentation of @Inherited

  

请注意,如果带注释,则此元注释类型无效   type用于注释除类之外的任何内容。   另请注意,此元注释仅导致注释从超类继承; 对已实现接口的注释无效

答案 1 :(得分:1)

我很确定这是不可能的。

首先,因为需要@MappedSuperclass来继承超类中的映射注释。所以我不明白为什么映射注释会自动从接口继承。

其次,因为如果类中的JPA anotations在字段而不在getter上,则getter上的注释将被忽略。

规范第2.11.2段说:

  

实体可以从提供持久实体状态和映射信息的超类继承,   但这本身并不是一个实体。通常,这种映射超类的目的是定义状态   和映射多个实体类共有的信息。

     

与实体不同,映射的超类不可查询,不得作为参数传递给   EntityManager的   要么   询问   操作。由映射的超类定义的持久关系必须   是单向的。

     

抽象和具体类都可以指定为映射的超类。该   MappedSuper-   类   注释(或   映射,超   XML描述符元素)用于指定a   映射的超类。

(强调我的)

这是关于继承的章节,有关从接口继承映射的规范talsk。映射只能从抽象类或具体类继承。