子类getter上的@NotNull会影响父类表

时间:2017-02-07 08:37:59

标签: java postgresql hibernate jpa bean-validation

我有一个与javax.validation.constraints.NotNull annotation相关的问题。 在我的项目中,我确实有类似下面的类树:

@Inheritance(strategy = InheritanceType.JOINED)
class Ssss {
    @ManyToOne
    private Xxxx x;
    public Xxxx getXxxx() {
       return x;
    }
}

@Inheritance(strategy = InheritanceType.JOINED)
class Yyyy extends Ssss {
    @Override
    //some not important annotations
    public Xxxx getXxxx() {
        return super.getXxxx();
    }        
}

@Inheritance(strategy = InheritanceType.JOINED)
class Zzzz extends Ssss {
    @Override
    //some not important annotations
    @NotNull
    public Xxxx getXxxx() {
        return super.getXxxx();
    }
}

这三个类作为三个表存储在数据库中。 对于模式创建,我正在使用Hibernate

hibernate.hbm2ddl.auto=create

Hibernate在NOT NULL字段中为超级 ssss 生成的表中存储的xxxx_object_id字段是否为预期行为,如下所示:??

Postgres

我找不到有关hibernate如何对继承的getter处理@NotNull的任何相关信息。

有人可以帮我解决这个问题吗? 最诚挚的问候。
米甲

3 个答案:

答案 0 :(得分:1)

是。 Hibernate有一些约束,它会在发生冲突时继续检查。
这是一个例子:

@Inheritance(strategy = InheritanceType.JOINED)
class Ssss {

   @ManyToOne
   private Xxxx x;
   public Xxxx getXxxx() {
      return x;
   }
}

如果这么多,那么hibernate没有冲突,因为它使x类型的Xxxx null
但问题出在此代码中:

@Inheritance(strategy = InheritanceType.JOINED)
class Zzzz extends Ssss {
   @Override
   //some not important annotations
   @NotNull
   public Xxxx getXxxx() {
       return super.getXxxx();
   }
}

此处通过@NotNull注释通知Hibernate将x类型的Xxxx设为@NotNull
在上述两种情况下,存在冲突,对于Sss,它可以是Null,而Zzzz则不能为空。为了推断并解决冲突,Hibernate也将Ssss的Xxxx类型变量设置为NotNull。

答案 1 :(得分:0)

@NotNullJSR 303 Bean Validation注释。这用于验证,以确保该实体属性(字段)的实例值将反弹任何违反该约束的进程。 这与表创建无关

相反,如果我们使用@Column(nullable = false) 这是针对数据库的。具体来说,当使用该选项生成模式时(如果使用hibernate生成DDL), 它确保将“NULLABLE”属性分配给相应的数据库表列(字段)。

请参阅以下链接以获得更清晰Confusion: @NotNull vs @Column(nullable = false)

答案 2 :(得分:0)

谢谢@Tahir。

我正在使用注释@Size测试相同的方案 超类(Ssss)有一些String字段:

@Inheritance(strategy = InheritanceType.JOINED)
class Ssss {
    @ManyToOne
    private String description;

    @Size(min = 100, max = 150)
    public String getDescription() {
       return description;
    }
}

@Inheritance(strategy = InheritanceType.JOINED)
class Yyyy extends Ssss {

    @Override
    @Size(min = 10, max = 60)
    public String getDescription() {
       return description;
    }        
}

@Inheritance(strategy = InheritanceType.JOINED)
class Zzzz extends Ssss {

    @Override
    @Size(min = 200, max = 255)
    public String getDescription() {
       return description;
    }
}

在这种情况下,Hibernate生成的列具有与超类(Ssss)相同的 max 宽度: enter image description here
我是对的,Hibernate无法解决冲突,只考虑来自Ssss的 max ?您是否知道在使用@Pattern@Min@Max等注释时解决类似冲突的问题以及Hibernate的行为是什么?

此致

相关问题