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

2023-11-23

我使用 Hibernate + JPA 作为我的 ORM 解决方案。

我使用 HSQL 进行单元测试,使用 PostgreSQL 作为真正的数据库。

我希望能够使用 Postgres 的原生UUID使用 Hibernate 键入,并在 HSQL 的字符串表示形式中使用 UUID 进行单元测试(因为 HSQL 没有 UUID 类型)。

我正在使用具有不同配置的持久性 XML 进行 Postgres 和 HSQL 单元测试。

以下是我让 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 4 中寻求解决方案的人(因为 Dialect#addTypeOverride 方法不再可用),我找到了一个,基于这是史蒂夫·埃伯索尔的评论

您必须构建一个像这样的自定义用户类型:

public class UUIDStringCustomType extends AbstractSingleColumnStandardBasicType {

    public UUIDStringCustomType() {
        super(VarcharTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE);
    }

    @Override
    public String getName() {
        return "pg-uuid";
    }

}

要将其绑定到 HSQLDB 方言,您必须构建一个自定义方言来重写 Dialect#contributeTypes 方法,如下所示:

public class CustomHsqlDialect extends HSQLDialect {


    @Override
    public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
        super.contributeTypes(typeContributions,serviceRegistry);
        typeContributions.contributeType(new UUIDStringCustomType());
    }

}

然后您可以将 @Type(type="pg-uuid") 与两个数据库一起使用。

希望它能帮助某人...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不同情况下使用不同的 Hibernate 用户类型 的相关文章

随机推荐

  • Javascript es6 覆盖静态属性

    尝试 ES6 并尝试创建一个具有静态属性和解析函数的类 然后我想为我正在解析的每种不同类型扩展基本解析器 不确定我是否正在执行反模式 但我无法覆盖静态属性 这是我的基本解析器 class Module static name Default
  • 使用 Python 提取文件名中含有无效字符的文件

    我使用 python 的 zipfile 模块来提取 zip 存档 让我们将此文件放在http img dafont com dl f akvaleir例如 f zipfile ZipFile akvaleir zip r for file
  • iOS8 自动布局以编程方式固定到相对布局边距

    我有一个 UI 元素 UISwitch实际上 但实际上并不重要 它在 Interface Builder 中将前导和尾随空间固定到超级视图 Xcode 6 中的约束如下所示 前导空间的约束实际上是相同的 约束的值为42 0分 这正是我想要的
  • 如何使用 Groovy 高效列出 Jenkins 上当前正在运行的**所有**作业

    我一直试图在 Groovy 脚本编写器脚本中找到一种轻量级方法来列出所有当前正在运行的任何类型的作业 我发现唯一可靠的方法是 start System currentTimeMillis def jobsFound def building
  • 有没有办法强制 Checkstyle 忽略源代码中的特定警告? [复制]

    这个问题在这里已经有答案了 PMD 有一种方法可以忽略特定警告 NOPMDJava 源文件中的注释 Checkstyle有类似的选项吗 是的 看看抑制评论过滤器 and 抑制附近评论过滤器选项
  • 用mybatis 3调用pl/sql函数

    我有一个在 pl sql 中返回布尔值的函数 我已经尝试过 直接获取该布尔值没有成功 所以现在我尝试将其转换为字符串 我不想修改数据库
  • 多次执行python脚本

    我不确定执行此操作的最佳方法 但我有一个保存为 py 的 python 脚本 该脚本的最终输出是两个文件 x1 txt 和 y1 txt 基本上我想运行这个脚本1000次 每次运行用新名称写入我的两个文本文件 即x1 txt y1 txt
  • 我可以使用 Bamboo Rest - API 下载 Bamboo 构建的工件吗?

    This页面状态 Bamboo 的 REST API 提供以下功能 检索构建的工件 and here我看到文档 http myhost com 8085 bamboo rest api latest plan projectKey buil
  • 更改 C# ASP.NET 3.5 中的 HtmlForm 操作

    我有一个表格
  • SQL Server 数据库 AND 视图中的表数量是否有限制?

    我正在使用 SQL Server 标准版上的数据库 每天加载数据 性能SQLBulkInsert随着表的增长和索引 I O 的启动 速度会减慢 即使禁用 重建 速度也会变慢 因此 我建议的另一种选择是创建一个引用每个每日表 例如最后 30
  • ValueError:字典更新序列元素#0的长度为1;需要 2 个

    我回来了5对于我的计算领域old default code 并且我收到以下错误 ValueError 字典更新序列元素 0的长度为1 需要 2 个 我究竟做错了什么 该函数的Python代码 def old default code sel
  • 从 bean 强制关闭 Spring 的最佳方法?

    我的应用程序使用 SpringDefaultMessageListenerContainer处理传入的消息 应用程序的 main 方法已经注册了一个关闭钩子 问题是 强制关闭应用程序上下文的最佳方法是什么 如果我扔一个RuntimeExce
  • 添加形状到 LinearLayout Android

    我有一个线性布局 有一些自动完成和文本框 我想在线性布局中插入一个形状 矩形 我怎样才能做到这一点 我是安卓新手
  • 将 WCF 服务转换为 RESTful 应用程序?

    嘿 我在将 wcf 变成一项轻松的服务方面没有取得任何进展 所以我想知道当您在此处启动 WCF 服务应用程序时是否有人可以获取基本代码 using System using System Collections Generic using
  • 当我只知道字符偏移量时,如何创建范围对象?

    所以我有一个包含文本块的 div 之前用户已在该块中选择了一些文本 并且我从该选择中创建了一个范围对象 我存储了所选文本的起点和终点的偏移量 但在重新创建范围时遇到问题 以便我可以操纵它 quotables 是保存所有文本的 div 我不知
  • Spring Boot + Thymeleaf 找不到消息属性

    我正在尝试使用 Spring Boot 和 Thymeleaf 创建一个 Web 应用程序 但在让模板使用属性文件中定义的消息时遇到问题 它不是显示属性文件中定义的消息 而是显示 form welcome en GB 控制台没有记录任何错误
  • 如何知道 JavaScript 中的计时器是否被清除或超时?

    好吧 非常简单的问题 我正在参加 javascript 速成课程 如果我使用timer setTimeout 500 设置计时器 然后clearTimeout timer 要清除计时器 计时器的整数值不会改变 所以我的问题是如何知道计时器是
  • 初始化/重置结构为零/空

    struct x char a 10 char b 20 int i char c char d 10 我正在填充这个结构 然后使用这些值 在下一次迭代中 我想将所有字段重置为0 or null在我开始重用它之前 我怎样才能做到这一点 我可
  • Java:如何在 Swing 中进行双缓冲?

    EDIT TWO 为了防止尖锐的评论和一行回答没有抓住要点 IFF就像打电话一样简单设置双缓冲 真 那么我如何访问当前的离线缓冲区 以便我可以开始弄乱 BufferedImage 的底层像素数据缓冲区 我花时间写了一段正在运行的代码 看起来
  • 在不同情况下使用不同的 Hibernate 用户类型

    我使用 Hibernate JPA 作为我的 ORM 解决方案 我使用 HSQL 进行单元测试 使用 PostgreSQL 作为真正的数据库 我希望能够使用 Postgres 的原生UUID使用 Hibernate 键入 并在 HSQL 的