java hibernate mariaDB 列“字段”不能为空

Posted

技术标签:

【中文标题】java hibernate mariaDB 列“字段”不能为空【英文标题】:java hibernate mariaDB Column 'field' cannot be null 【发布时间】:2021-10-22 21:40:37 【问题描述】:

我正在尝试找出我的问题存在的原因。 我将默认值设置为“用户”,但休眠状态说该字段不能为空。

错误代码:

*Hibernate: insert into user2 (active, role, user_id) values (?, ?, ?)
2021-08-22 00:40:28.182  WARN 154195 --- [nio-8180-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1048, SQLState: 23000
2021-08-22 00:40:28.182 ERROR 154195 --- [nio-8180-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=3610) Column 'role' cannot be null
2021-08-22 00:40:28.195 ERROR 154195 --- [nio-8180-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

java.sql.SQLException: Column 'role' cannot be null*

实体是在字段(USER)的默认值内设计的:

@Column(nullable = false, columnDefinition = "varchar(16) default 'USER'")
private String role;

在 DB 内部也存在默认值。

我找到了带有@PrePersist 注释的解决方案,但奇怪的是为什么我需要使用这样的东西:

@PrePersist
private void onPrePersist()  role = "USER"; 

【问题讨论】:

感谢 João 在格式化方面的帮助 :) 欢迎@AZetZ ;) 【参考方案1】:

这对你有用。

@Column(nullable = false, columnDefinition = "varchar(16)")
 private String role = "USER";

【讨论】:

谢谢,当然可以。但是注释内部的声明和没有注释的字段的默认值之间存在一些差异。我的问题是错误的原因是什么。也许两种声明方式之间的编译步骤有任何区别。第三种方式也是我用@PrePersist 提到的解决方案。【参考方案2】:

如果我没记错的话,columnDefinition = "varchar(16) default 'USER'" 已经保证您永远不会在数据库中拥有null 角色,因为它会影响 SQL 表定义。

话虽如此,我建议从字段中的@Column 注释中删除nullable = false

【讨论】:

太棒了!我不认为它是相反的 - 默认值与 nullable=false 我可以在测试后添加“default = 'USER'”至少在当前版本的 Spring boot/JPA/Hibernate(/...?) 中不起作用。默认值被添加到 MariaDB 中,但在 java 代码中它不起作用。因此,@vaibhavsahu 解决方案(私有字符串角色 =“用户”)可能是解决此问题的最简单方法,或者可能是 PrePersist 中的条件。再次感谢两位 是的,@vaibhavsahu 建议实际上是最简单的方法,但您的实现也应该有效(参考 baeldung.com/jpa-default-column-values)。

以上是关于java hibernate mariaDB 列“字段”不能为空的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 的 MariaDB 方言类名称是啥?

org.hibernate.MappingException:无法确定类型:java.util.List,在表:用户,列:[org.hibernate.mapping.Column(事件)]

org.hibernate.MappingException:无法确定类型:java.util.Set,表:USERS,列:[org.hibernate.mapping.Column(invoices

Java Spring JPA Hibernate没有更新列

如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性

markdown 使用Hibernate和MariaDB开发Jersey(Restful Web)应用程序