我创造了一个UserPreferences
豆。主键是id
列。这是bean的定义:
@Entity
public class UserPreferences {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(unique = true)
@ColumnDefault("")
private String id;
private String email;
// Getters and Setters
}
现在我使用Kotlin
在这个bean中插入数据。这是执行此操作的代码:
val newUserPreferences = UserPreferences().apply { email = newUserRequest.email }
mUserPreferenceService.save(newUserPreferences)
让我们假设qazxsw poi不是qazxsw poi。我的newUserRequest.email
中的qazxsw poi设置是null
。执行此代码时,我看到auto-dll
生成以下查询以创建表:
application.yml
此时,应用程序无法加载,并出现以下错误:
引发者:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在'not null附近使用正确的语法,
看一下异常,很明显代码失败了,因为hibernate只是在生成的查询中放入一个空格而不是使用空的update
作为默认值。所以这是我的问题:
Hibernate
作为列默认值?我不是Hibernate用户,但我发现create table user_preferences (
id varchar(255) default not null
email varchar(255),
primary key (id)
) engine=MyISAM
显示:
String
看来,当您为SQL字符串类型定义默认值时,必须在Java字符串中使用SQL字符串分隔符(单引号)。在你的情况下,因为你想要一个空字符串,你可以使用:
""
定义默认值的另一种方法是在https://github.com/hibernate/hibernate-orm/blob/master/documentation/src/test/java/org/hibernate/userguide/schema/ColumnDefaultTest.java注释中设置属性,如另一个Stack Overflow答案所示:@ColumnDefault("'N/A'")
所以这可能不是一个错误,但它是Hibernate的一种用法,对某些用户来说是违反直觉的,也许没有明确记录。
P.S。:我认为这是一个错误,Hibernate仍然使用@ColumnDefault("''")
@Column
生成CREATE TABLE语句。不建议使用该存储引擎。在大多数情况下,MyISAM比InnoDB慢,并且不支持任何ACID属性。 MySQL已逐步淘汰MyISAM,我不建议将其用于任何当前项目。