jpa @列(nullable=false)验证应用程序级别的空值检查

igetnqfo  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(233)

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

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)       |           |          |
jchrr9hc

jchrr9hc1#

我不能评论以上(代表是不够高),也没有足够的知道,这将回答这个问题,但看看这里:https://www.baeldung.com/hibernate-notnull-vs-nullablehttps://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html如果设置了此设置,Hibernate将在DB之前检查null。

spring.jpa.properties.hibernate.check_nullability

所以我想你已经有房产了。

58wvjzkj

58wvjzkj2#

这是由于Sping Boot 2.3.x中的变更:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#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
hibernate.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>

(or Bean验证的各个依赖关系(如果您愿意)

相关问题