Java 如何在hibernate验证程序中创建可选/可空属性?
我发现这基本上是我想要的Java 如何在hibernate验证程序中创建可选/可空属性?,java,hibernate,jpa,kotlin,Java,Hibernate,Jpa,Kotlin,我发现这基本上是我想要的 @ConstraintComposition(OR) @NotBlank @Null @ReportAsSingleViolation @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = {}) public @interface NullOrNotBlank { String message
@ConstraintComposition(OR)
@NotBlank
@Null
@ReportAsSingleViolation
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
public @interface NullOrNotBlank {
String message() default "{org.hibernate.validator.constraints.NullOrNotBlank.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
我也试过了
@field:NullOrNotBlank
@field:Size(max = 50)
@field:Column(nullable = true)
var middleName: String? = null,
但这种复合约束使数据库(MySQL)中的字段不可为空。因此,在我将实体保存到数据库之前,它工作正常。在我嵌入
hibernate验证器之后,我的验证也失败了
为什么hibernate validator将可空列更改为不可空列
如果您在列上声明了任何不可为空的约束,则hibernate验证器
将使列变为不可为空的列,例如:
@[ConstraintComposition(OR) NotBlank Null]
// ^---- it is a @NotNull constraint
@NotNull
public @interface NotBlank {...}
@[ConstraintComposition(OR) Length(min = 1) Null]
//it is a nullable constraint ---^
如何解决这个问题
如果您在github上看过my,您可能会发现我使用了一个@Length
,这是一个可空的约束,那么hibernate验证器
根本不会更改原始列定义,例如:
@[ConstraintComposition(OR) NotBlank Null]
// ^---- it is a @NotNull constraint
@NotNull
public @interface NotBlank {...}
@[ConstraintComposition(OR) Length(min = 1) Null]
//it is a nullable constraint ---^
在我嵌入
hibernate验证器之后
my也失败了
为什么hibernate validator将可空列更改为不可空列
如果您在列上声明了任何不可为空的约束,则hibernate验证器
将使列变为不可为空的列,例如:
@[ConstraintComposition(OR) NotBlank Null]
// ^---- it is a @NotNull constraint
@NotNull
public @interface NotBlank {...}
@[ConstraintComposition(OR) Length(min = 1) Null]
//it is a nullable constraint ---^
如何解决这个问题
如果您在github上看过my,您可能会发现我使用了一个@Length
,这是一个可空的约束,那么hibernate验证器
根本不会更改原始列定义,例如:
@[ConstraintComposition(OR) NotBlank Null]
// ^---- it is a @NotNull constraint
@NotNull
public @interface NotBlank {...}
@[ConstraintComposition(OR) Length(min = 1) Null]
//it is a nullable constraint ---^
生成的
NullOrNotBlank
列是notnull
,当我插入一个属性为NULL的实体时,它会引发一个错误。我想您应该尝试使用hbm2ddl.auto
来更新列中的约束。如果列存在,它根本不会更新约束。所以你应该手动更新它。请看这里:现在怎么样?如果没有问题。您应该删除您的问题,因为它是重复的。我正在使用hbm2ddl.auto=create drop在Startup上重新创建表,您确定吗?您是否在列字段上使用了@Column(nullable=true)
?@NullOrNotBlank
仅用于验证,不支持列定义。NullOrNotBlank
的生成列为notnull
,当我插入一个具有NULL属性的实体时,它会引发一个错误。我想您应该尝试使用hbm2ddl.auto
来更新列中的约束。如果列存在,它根本不会更新约束。所以你应该手动更新它。请看这里:现在怎么样?如果没有问题。您应该删除您的问题,因为它是重复的。我正在使用hbm2ddl.auto=create drop在Startup上重新创建表,您确定吗?您是否在列字段上使用了@Column(nullable=true)
?@NullOrNotBlank
仅用于验证,不支持列定义。感谢您的回答!我在实现中所做的是将@Length
替换为@Size(min=1)
,以便它可以应用于其他数据类型。我还注意到,我的旧实现忽略了@NotBlank
约束。因为在我将其更改为@Size(min=1)
之后,一些断言违规次数的测试失败了。@jasperagrante根本没有。昨晚我发现hibernate验证器
将更改DDL
定义。我也已经在我的应用程序上实现了Flyway,因此我可以控制模式和迁移。再次感谢:)谢谢你的回答!我在实现中所做的是将@Length
替换为@Size(min=1)
,以便它可以应用于其他数据类型。我还注意到,我的旧实现忽略了@NotBlank
约束。因为在我将其更改为@Size(min=1)
之后,一些断言违规次数的测试失败了。@jasperagrante根本没有。昨晚我发现hibernate验证器
将更改DDL
定义。我也已经在我的应用程序上实现了Flyway,因此我可以控制模式和迁移。再次感谢:)