【问题标题】:How to override @annotations (javax.validation) in a subClass如何在子类中覆盖@annotations (javax.validation)
【发布时间】: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 打印屏幕图片中看到的那样。

谢谢

【问题讨论】:

    标签: java hibernate spring-mvc jpa bean-validation


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在子类的属性上使用@NotNull 注释,但是hibernate 无论如何都会在创建的表上添加非空约束。我已经尝试过 SINGLE_TABLE 和 JOINED 策略。你知道如何解决这个问题吗?
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多