使用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
之间的类型差异。
如何以规范方式解决此问题? Canonical对我来说意味着:
type="uuid"
上妥协@Column(..., columnDefinition="CHAR")
,因为这不是严格的便携式(我目前正在通过自己覆盖Liquibase的UUIDType
并使列成为VARCHAR
来解决这个问题,但严格来说,CHAR
似乎更好了。看起来像是一种矫枉过正的解决方案。)
显然,这不是一个直接问题(因为我有解决方法),但我想学习正确的方法。