我定义了一个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;
我没有被卡住 - 我可以获得我需要的功能。我只是好奇:是否有一个“技巧”让这个与界面的方法上的注释正常工作?或者有人可以指出我为什么不能按照我的预期工作的文件?
答案 0 :(得分:3)
注释继承不适用于方法。来自documentation of @Inherited
:
请注意,如果带注释,则此元注释类型无效 type用于注释除类之外的任何内容。 另请注意,此元注释仅导致注释从超类继承; 对已实现接口的注释无效。
答案 1 :(得分:1)
我很确定这是不可能的。
首先,因为需要@MappedSuperclass来继承超类中的映射注释。所以我不明白为什么映射注释会自动从接口继承。
其次,因为如果类中的JPA anotations在字段而不在getter上,则getter上的注释将被忽略。
规范第2.11.2段说:
实体可以从提供持久实体状态和映射信息的超类继承, 但这本身并不是一个实体。通常,这种映射超类的目的是定义状态 和映射多个实体类共有的信息。
与实体不同,映射的超类不可查询,不得作为参数传递给 EntityManager的 要么 询问 操作。由映射的超类定义的持久关系必须 是单向的。
抽象和具体类都可以指定为映射的超类。该 MappedSuper- 类 注释(或 映射,超 XML描述符元素)用于指定a 映射的超类。
(强调我的)
这是关于继承的章节,有关从接口继承映射的规范talsk。映射只能从抽象类或具体类继承。