@Column(nullable=false)在应用程序级别验证空检查



根据我的理解,nullable = false(比如对于列customerid)只对使用hibernate创建模式有用,并且在持久化之前不应该进行任何类型的验证。我的数据库列没有这样的约束(它可以接受null值),当持久化customerid为null的实体时,得到这个错误

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value :b
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:111) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:55) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at 

在我将spring boot版本更新到2.4.2后,这个错误开始持续出现

实体类

public class FaceIndexResponse extends AuditEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name="customer_id",nullable = false)
private String customerId;
@Column(name="application_id")
private String appid;}

试图保存上述实体的服务类

public IndexFacesResult handle(FaceIndexModel model) throws IOException{
FaceIndexResponse response=new FaceIndexResponse();
response.setAppid(model.getApplicationId);
faceIndexResponseJpa.save(response);
}

Table "public.face_index_response"
Column     |            Type             | Collation | Nullable |             Default              
----------------+-----------------------------+-----------+----------+----------------------------------
id             | integer                     |           | not null | generated by default as identity
customer_id    | character varying(64)       |           |          | 
application_id | character varying(64)       |           |          | 

这是由于Spring Boot 2.3.x的变化:

https://github.com/spring - projects/spring boot/wiki/spring -引导- 2.3 -释放-笔记# validation-starter-no-longer-included-in-web-starters

从#19550开始,Web和WebFlux启动器不再默认依赖于验证启动器。如果您的应用程序正在使用验证特性,例如,您发现javax.validation.*导入没有被解析,那么您需要自己添加启动器。

从2.3.0开始,Validation启动器不再包含在Web启动器中。这意味着Bean Validation不再位于类路径上,从而导致Hibernate的行为发生变化。这在Hibernate文档中有说明:

https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html _bean_validation_options

冬眠。Check_nullability(如true或false)启用空性检查。如果标记为非空的属性为空,则引发异常。

如果类路径中存在Bean验证并且使用了Hibernate注解,则默认为false,否则为true。

因此,突然发生的验证可以通过两种方式解决:

  • 通过将spring.jpa.properties.hibernate.check_nullability设置为false,如PDiddly的回答
  • 所示
  • 或者通过将spring-boot-starter-validation依赖项添加到您的项目:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

(如果您愿意,也可以选择用于bean验证的独立依赖项)

我不能在上面评论(rep不够高),也不足以知道这将回答这个问题,但是看看这里:https://www.baeldung.com/hibernate-notnull-vs-nullable和https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html如果您设置了这个值,Hibernate将在数据库之前检查null。

spring.jpa.properties.hibernate.check_nullability

我想你已经设置了那个属性。

相关内容

  • 没有找到相关文章