如何在子类中覆盖@annotations (javax.validation)

Posted

技术标签:

【中文标题】如何在子类中覆盖@annotations (javax.validation)【英文标题】:How to override @annotations (javax.validation) in a subClass 【发布时间】:2016-03-25 08:37:23 【问题描述】:

我有这个Entity,那是一个超类:

@Entity
public class Father implements Serializable    

    @Column(name = "name")
    @Size(min=1, max=10)
    @Pattern(regexp="^[A-Za-z ]*$")
    @NotNull
    private String name;


这个,扩展了上面的一个:

@Entity    
public class FatherSub extends Father implements Serializable  

    private String name;


如您所见,FatherSub 中没有@Annotations,我也不想要它们。 我怎样才能覆盖它们?有什么办法吗?

好像@NotNull的注解在子类中持久化,让我填 Father.name(不是 FatherSub.name)正如您在这 2 张 Eclipse 打印屏幕图片中看到的那样。

谢谢

【问题讨论】:

【参考方案1】:

注解仅代表某个特定时间段的一些元信息,在具有子类时不可重写。因此,如何实现注释继承取决于实现。对于 Validator Framework,分散在多个继承类中的注解是aggregated。

在您的示例中,FatherSub#name 成员隐藏Father#name 成员。这意味着FatherSub 的所有实例都将与FatherSub 中定义的name 一起使用。但是因为Validation实现也考虑了继承的注解,虽然FatherSub#name没有@Column注解,还是会弹出错误。您无法更改此行为,因此您必须选择根本不使用继承或为子类而不是父类提供验证器注释。

此外,您不需要在FatherSub 中显式实现Serializable,因为Father 已经实现了它。

【讨论】:

我在子类的属性上使用@NotNull 注释,但是hibernate 无论如何都会在创建的表上添加非空约束。我已经尝试过 SINGLE_TABLE 和 JOINED 策略。你知道如何解决这个问题吗?

以上是关于如何在子类中覆盖@annotations (javax.validation)的主要内容,如果未能解决你的问题,请参考以下文章

JAV07接口与继承之动手动脑问题解决

注释(Annotation)

Python:如何覆盖子类中实例属性的类型提示?

如何在 UIButton 子类中覆盖 -drawrect?

在子类中覆盖时如何调用私有虚拟基类实现

如何使用 drawRect 覆盖在 UIView 子类的某些区域中获得透明度