@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 就没有 冲突,因为它将类型 Xxxx
的 x
设为 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 被告知将 Xxxx
的 x
类型设为 @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 的行为是什么?
问候
我有一个与 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 就没有 冲突,因为它将类型 Xxxx
的 x
设为 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 被告知将 Xxxx
的 x
类型设为 @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 的行为是什么?
问候