Java Hibernate用户类型和定义的长度

Java Hibernate用户类型和定义的长度,java,hibernate,uuid,Java,Hibernate,Uuid,我有一个hibernate用户类型,如下所示: public class UUIDHibernateType implements UserType { private static final int[] SQL_TYPES = new int[] { Types.CHAR }; public int[] sqlTypes () { return SQL_TYPES; } // ... } <id name="id"

我有一个hibernate用户类型,如下所示:

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

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

    // ...
}
<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>
我遇到的问题是,hibernate生成了一个类型为CHAR(1)的sql脚本,这是不正确的,我实际上需要CHAR(36)。如何定义自定义类型的默认长度

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

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

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

    // ...
}
<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和数据库无关有更好的想法,我将不胜感激。

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

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

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

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

//用你的方言 registerColumnType(1337,“字符(36)”)


我没有尝试过,但据报道它在Hibernate论坛上起作用。

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

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

//用你的方言 registerColumnType(1337,“字符(36)”)


我没有尝试过,但据报道它在Hibernate论坛上起作用。

如果您不关心UUID在数据库中的表示方式(在本例中,它将在base 10中表示),您还可以将UUID映射到用户类型中的BigInteger(java.sql.Types.BIGINT)。

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

这不是一个选项,我必须自己提供id,因为它需要在保存对象之前创建(实际的保存是异步进行的)。在这种情况下,请查看UUID生成器的源代码,了解它是如何指定列大小的。这肯定是一个想法,我会看一看,但我想我会在每个方言实现中找到它,因为UUID和GUID在任何数据库中都不是本机可用的。这不是一个选项,我必须自己提供id,因为它保存对象之前要创建的EED(实际保存是异步进行的)。在这种情况下,请查看UUID生成器的源代码,了解它如何指定列大小。这肯定是一个想法,我会看一看,但我想我会在每个方言实现中找到它,因为UUID和GUID在任何数据库中都不是本机可用的。原则上听起来不错,但我不能对方言进行子类化,因为用户(实现者)应该能够指定自己的方言,而不必担心映射。但我会看看是否可以在会话工厂中添加此类型。原则上听起来不错,但我不能对方言进行子类化,因为用户(实现者)应该能够指定它自己的方言,而不必担心映射。但是我会看看是否有可能在会话工厂中添加这种类型。