根据我的理解,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
我想你已经设置了那个属性。