1

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

我没有被困住——我可以获得我需要的功能。我只是好奇:是否有一个“技巧”可以让它与接口方法上的注释一起正常工作?或者有人可以指出我为什么这不能像我预期的那样工作的文档吗?

4

2 回答 2

3

注解继承不适用于方法。从以下文档@Inherited

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

于 2013-04-05T14:00:54.807 回答
1

我很确定这是不可能的。

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

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

规范的第 2.11.2 段说:

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

与实体不同,映射的超类是不可查询的,并且不能作为参数传递给 EntityManager 或 Query 操作。映射超类定义的持久关系必须是单向的。

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

(强调我的)

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

于 2013-04-05T14:03:26.073 回答