根据我的理解,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) | | |
2条答案
按热度按时间jchrr9hc1#
我不能评论以上(代表是不够高),也没有足够的知道,这将回答这个问题,但看看这里:https://www.baeldung.com/hibernate-notnull-vs-nullable和https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html如果设置了此设置,Hibernate将在DB之前检查null。
所以我想你已经有房产了。
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
相依性加入至项目:(or Bean验证的各个依赖关系(如果您愿意)