Java 用Liquibase使冬眠愉快';s";uuid“;

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。现

使用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
之间的类型差异

如何以规范的方式解决此问题?对我来说,经典的方法是:

  • 不要在Liquibase更改日志中的
    type=“uuid”
    上妥协
  • 不要使用
    @Column(…,columnDefinition=“CHAR”)
    ,因为这不是严格意义上的可移植性
(我目前正在解决这个问题,我自己重写了Liquibase的
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类型。