2

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

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 和数据库不可知有更好的想法,我将不胜感激。

4

3 回答 3

0

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

// 在你的自定义类型中 public int[] sqlTypes() { return new int[] { 1337 }; }

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

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

于 2010-01-05T17:37:52.287 回答
0

我建议使用 Hibernate 的内置 UUID 生成器(请参阅文档)。Hibernate然后应该弄清楚PK列的正确映射和大小等。

于 2010-01-05T15:43:16.587 回答
0

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

于 2014-04-17T11:48:18.393 回答