【问题标题】:Hibernate UserType and a defined lengthHibernate UserType 和定义的长度
【发布时间】:2010-01-05 15:31:35
【问题描述】:

我有一个类似这样的休眠用户类型:

public class UUIDHibernateType implements UserType
{
    private static final int[] SQL_TYPES = new int[] { Types.CHAR };

    public int[] sqlTypes ()
    {
        return SQL_TYPES;
    }

    // ...
}

我遇到的问题是,hibernate 会生成一个不正确的 CHAR(1) 类型的 sql 脚本,我实际上需要 CHAR(36)。如何定义自定义类型的默认长度?

目前我一直坚持这样定义 sql 类型:

<id name="id"
    type="org.openscada.ae.server.storage.jdbc.internal.UUIDHibernateType">
    <column name="ID" length="36" sql-type="CHAR(36)" not-null="true" />
    <generator class="assigned" />
</id>

在这种情况下应该没有问题,但是如果需要我该怎么做呢?

PS:如果有人对如何透明地处理 UUID 和数据库不可知论有更好的了解,我将不胜感激。

【问题讨论】:

    标签: java hibernate uuid


    【解决方案1】:

    我建议使用 Hibernate 内置的 UUID 生成器(参见the docs)。然后Hibernate应该算出PK列的正确映射和大小等。

    【讨论】:

    • 这不是一个选项,我必须自己提供id,因为它需要在保存对象之前创建(实际保存是异步发生的)。
    • 在这种情况下,请查看 UUID 生成器的源代码,它是如何指定列大小的。
    • 这绝对是一个想法,我会看看,但我想我会在每个方言实现的某个地方找到它,因为 uuid 和 guid 在任何数据库中都不是原生可用的。
    【解决方案2】:

    UserType.sqlTypes 返回的代码用于在 Dialect 中查找注册的类型。因此,如果您有 sqlTypes 返回一个尚未使用的代码,您可以将您的 Dialect 子类化并将该代码注册为 char(36)。例如:

    // 在你的自定义类型中 公共 int[] sqlTypes() { 返回新的 int[] { 1337 }; }

    // 在您的自定义方言中 registerColumnType(1337, "char(36)")

    我没有尝试过,但据报道它可以在 Hibernate 论坛上运行。

    【讨论】:

    • 原则上听起来不错,但我不能子类化方言,因为用户(实施者)应该能够指定它自己的方言,而不必担心映射。但是我会看看是否可以在会话工厂中添加这种类型。
    【解决方案3】:

    如果您不关心 UUID 在数据库中的表示方式(在这种情况下,它将以 base 表示),您还可以将 UUID 映射到 UserType 中的 BigInteger (java.sql.Types.BIGINT) 10).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2012-02-09
      • 2023-03-26
      相关资源
      最近更新 更多