我正在使用Hibernate + JPA作为我的ORM解决方案。
我正在使用HSQL进行单元测试,并使用PostgreSQL作为真正的数据库。
我希望能够将Postgres的本机UUID类型与Hibernate一起使用,并在其String表示形式中将UUID与HSQL一起用于单元测试(因为HSQL没有UUID类型)。
我正在为Postgres和HSQL单元测试使用具有不同配置的持久性XML。
这是我让Hibernate“看到”我的自定义UserType的方法:
@Id @Column(name="UUID", length=36) @org.hibernate.annotations.Type(type="com.xxx.UUIDStringType") public UUID getUUID() { return uuid; } public void setUUID(UUID uuid) { this.uuid = uuid; }
而且效果很好。但是我需要的是能够以XML形式或从无需重新编译即可更改的属性文件中交换注释的“ com.xxx.UUIDStringType”部分的功能。
有任何想法吗?
这个问题确实很老了,已经回答了很长时间,但是最近我也遇到了同样的情况,并且找到了一个很好的解决方案。首先,我发现Hibernate具有三种不同的内置UUID类型实现:
binary-uuid
uuid-char
pg-uuid
这些类型默认情况下已注册,并且可以为带@Type注释的给定字段指定,例如
@Type
@Column @Type(type = "pg-uuid") private UUID myUuidField;
还有 也是 在覆盖默认类型的机制Dialect。因此,如果最终的部署是与Postgres数据库进行通信,但是单元测试使用HSQL,则可以pg- uuid通过编写自定义方言来覆盖类型以读取/写入字符数据,如下所示:
Dialect
pg- uuid
public class CustomHSQLDialect extends HSQLDialect { public CustomHSQLDialect() { super(); // overrides the default implementation of "pg-uuid" to replace it // with varchar-based storage. addTypeOverride(new UUIDCharType() { @Override public String getName() { return "pg-uuid"; } }); } }
现在,只需插入自定义方言,该pg-uuid类型就可以在两种环境中使用。