我有一个与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
字段是否为预期行为,如下所示:??
我找不到有关hibernate如何对继承的getter处理@NotNull的任何相关信息。
有人可以帮我解决这个问题吗?
最诚挚的问候。
米甲
答案 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)
@NotNull
是JSR 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 宽度:
我是对的,Hibernate无法解决冲突,只考虑来自Ssss的 max ?您是否知道在使用@Pattern
,@Min
或@Max
等注释时解决类似冲突的问题以及Hibernate的行为是什么?
此致