Hibernate UserType和定义的长度

时间:2010-01-05 15:31:36

标签: java hibernate uuid

我有一个像这样的hibernate Usertype:

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和数据库agnostig,我很感激。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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