使用 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
现在,对于 MySQL,Hibernate 会认为这应该是VARCHAR
,而我们知道长度是固定的 ,CHAR
Liquibase 可以从中派生type="uuid"
(实际上,Liquibase 在它的 中定义了这个UUIDType
)。因此,启动时的 Hibernate 验证将对VARCHAR
和之间的类型差异犹豫不决CHAR
。
如何以规范的方式解决此问题?规范对我来说意味着:
- 不要
type="uuid"
在 Liquibase 更改日志中妥协 - 不要使用
@Column(..., columnDefinition="CHAR")
,因为这不是严格可移植的
(我目前正在通过自己覆盖 LiquibaseUUIDType
并将列设为 a来解决此问题VARCHAR
,但CHAR
无论如何,严格来说似乎更好。这似乎是一个矫枉过正的解决方案。)
显然,这不是一个直接的问题(因为我有解决方法),但我想学习正确的方法来做到这一点。