如何在子类中覆盖@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)的主要内容,如果未能解决你的问题,请参考以下文章