@NotNull on subclass getter 影响父 class table

@NotNull on subclass getter affects parent class table

我有一个与 javax.validation.constraints.NotNull annotation 有关的问题。 在我的项目中,我确实有 classes 树,如下所示:

@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();
    }
}

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

hibernate.hbm2ddl.auto=create

Hibernate 在存储在 table 中的 xxxx_object_id 字段上添加 NOT NULL 是否是为超级 class ssss[=35= 生成的预期行为? ] 如下所示:??

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

谁能帮我解决这个问题?
最好的问候。
米甲

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

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

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

如果是这么多,那么 hibernate 就没有 冲突,因为它将类型 Xxxxx 设为 null
但问题是,在这段代码中:

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

这里 Hibernate via @NotNull annotation 被告知将 Xxxxx 类型设为 @NotNull
以上两种情况有冲突,Ssss可以为Null,Zzzz不能为null。为了推断并解决冲突,Hibernate 也将 Ssss 的 Xxxx 类型变量设为 NotNull。

@NotNull 是一个 JSR 303 Bean Validation 注释。这是为了验证,以确保该实体 属性(字段)的实例值将反弹任何违反该约束的进程。 这与table创作无关

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

请参阅下面的内容 link 以了解更多信息 Confusion: @NotNull vs @Column(nullable = false)

谢谢@Tahir。

我正在测试相同的场景,但带有注释 @Size
超类(Ssss) 有一些字符串字段:

@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 生成的列具有与 superclass 相同的 max 宽度(Ssss):
Hibernate 无法解决冲突,所以认为 max 仅来自 Ssss,我说得对吗?您是否知道解决类似冲突的规则以及使用 @Pattern@Min@Max 等注释时 Hibernate 的行为是什么?

问候