2013-04-05 117 views
1

我定义了一个Versioned接口,期望我可以在任何想要使用JPA版本控制功能的持久化实体上实现它(例如,针对空中冲突进行比较版本,在更新时自动递增)。JPA实体是否可以从接口方法继承@Version?

public interface Versioned { 
    @Version 
    int getRevision(); 
} 

这不会节省很多(如果有的话)的编码,但它也给了我一个标记接口,我对以后的计划。

public class Foo implements Versioned { 
    private int revision; 

    @Override 
    public int getRevision() { 
      return revision; 
    } 
} 

@Version被允许上的方法,和我预想的富沿用Versioned界面特征。这似乎并非如此。我可以在数据库中更新我的Foo实例,但版本号不会自动更改。

但是,如果我添加了一个@Version注解实施,它将按预期工作:

@Version 
    private int revision; 

我不会卡住 - 我能得到我所需要的功能。我只是好奇:是否有一个“窍门”让这个与接口方法的注解一起正常工作?或者可以有人指出我为什么这不起作用,如我所料?

回答

3

注解继承不适用于方法。从documentation of @Inherited

请注意,此元注释类型没有影响,如果注释 类型用于注释不是类的任何其他。 还要注意,这个元注释只会导致注解从超类继承; 实施的接口上的注释不起作用

+0

是的,看起来像答案。很有意思。我有点惊讶,我从来没有遇到过这个。 – 2013-04-05 14:15:49

+0

我不认为\ @Inherited与此有任何关系。 JPA可以选择在超类和接口中查找注释。而且,如果超类用\ @MappedSuperclass注释的话。虽然它不在界面上。这只是该规范的一个选择。 – 2013-04-05 14:19:05

+0

@JBNizet,我认为Isaac希望注解继承能够在方法上工作,这就是为什么我给出了这个答案。我同意,JPA可以查看接口。 – WilQu 2013-04-05 14:28:04

1

我很确定这是不可能的。

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

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

段落2.11.2说:

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

映射超,不像一个实体,不可查询,并且必须不被作为参数传递到 的EntityManager 或 查询 操作。映射超类定义的持久关系必须是单向的。

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

(重点煤矿)

这是关于继承的章节中,无处造成大约从接口继承映射规范talsk。映射只能从抽象或具体类继承。