Java 用Liquibase使冬眠愉快';s";uuid“;
使用JPA/Hibernate,使用以下字段定义实体:Java 用Liquibase使冬眠愉快';s";uuid“;,java,mysql,hibernate,liquibase,liquibase-hibernate,Java,Mysql,Hibernate,Liquibase,Liquibase Hibernate,使用JPA/Hibernate,使用以下字段定义实体: @Id @Column(length = 36) private String id = UUID.randomUUID().toString(); 使用Liquibase,知道这是一个UUID,在更改日志中具有以下内容: <column name="id" type="uuid"> ... ... 我们喜欢在启动时使用Hibernate的hbm2ddl.auto=validate/ddl auto=validate。现
@Id
@Column(length = 36)
private String id = UUID.randomUUID().toString();
使用Liquibase,知道这是一个UUID,在更改日志中具有以下内容:
<column name="id" type="uuid">
...
...
我们喜欢在启动时使用Hibernate的hbm2ddl.auto=validate
/ddl auto=validate
。现在,对于MySQL,Hibernate会认为这应该是VARCHAR
,而我们知道长度是固定的,CHAR
,Liquibase可以从type=“uuid”
(事实上,Liquibase在其UUIDType
中定义这一点)。因此,启动时的Hibernate验证将阻止VARCHAR
和CHAR
之间的类型差异
如何以规范的方式解决此问题?对我来说,经典的方法是:
- 不要在Liquibase更改日志中的
上妥协type=“uuid”
- 不要使用
,因为这不是严格意义上的可移植性@Column(…,columnDefinition=“CHAR”)
UUIDType
,并将列设为VARCHAR
,但严格地说,CHAR
似乎更好。这似乎是一个杀伤力过大的解决方案。)
显然,这不是一个紧迫的问题(因为我有解决办法),但我想学习正确的方法。这不是严格意义上的可移植性:为什么不是?是否存在不具有字符类型的数据库?你真的认为你会使用另一个数据库吗?如果你这样做了,你真的认为这将是你的主要关注点吗?我们正在处理内部客户,他们可以在MySQL和SQL Server之间进行选择。一旦我们使用MySQL,SQL Server就是下一个了。我相信SQL Server对其
CHAR
/VARCHAR
类型的调用是不同的,虽然我不是专家。而且,正如我在问题中已经提出的,可以解决“问题”。但有时,找出问题的根源,并“正确”地做事也是件好事。谢谢你调查这件事。似乎表明char是一种有效的sql server类型。这不是严格意义上的可移植性:为什么不是?是否存在不具有字符类型的数据库?你真的认为你会使用另一个数据库吗?如果你这样做了,你真的认为这将是你的主要关注点吗?我们正在处理内部客户,他们可以在MySQL和SQL Server之间进行选择。一旦我们使用MySQL,SQL Server就是下一个了。我相信SQL Server对其CHAR
/VARCHAR
类型的调用是不同的,虽然我不是专家。而且,正如我在问题中已经提出的,可以解决“问题”。但有时,找出问题的根源,并“正确”地做事也是件好事。谢谢你调查这件事。似乎表明char是有效的sql server类型。