一尘不染

在不同情况下使用不同的休眠用户类型

hibernate

我正在使用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”部分的功能。

有任何想法吗?


阅读 205

收藏
2020-06-20

共1个答案

一尘不染

这个问题确实很老了,已经回答了很长时间,但是最近我也遇到了同样的情况,并且找到了一个很好的解决方案。首先,我发现Hibernate具有三种不同的内置UUID类型实现:

  1. binary-uuid :将UUID存储为二进制
  2. uuid-char :将UUID存储为字符序列
  3. pg-uuid :使用本地Postgres UUID类型

这些类型默认情况下已注册,并且可以为带@Type注释的给定字段指定,例如

@Column
@Type(type = "pg-uuid")
private UUID myUuidField;

还有 也是 在覆盖默认类型的机制Dialect。因此,如果最终的部署是与Postgres数据库进行通信,但是单元测试使用HSQL,则可以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类型就可以在两种环境中使用。

2020-06-20