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 列“字段”不能为空的主要内容,如果未能解决你的问题,请参考以下文章
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没有更新列