我有一个类似如下的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和数据库不可知,我将不胜感激。
发布于 2010-01-05 23:43:17
我建议使用Hibernate内置的UUID生成器(参见the docs)。然后,Hibernate应该找出PK列的正确映射和大小等。
发布于 2010-01-06 01:37:52
UserType.sqlTypes返回的代码在方言中用于查找已注册的类型。因此,如果您让sqlTypes返回一个尚未使用代码,您可以继承您的方言并将该代码注册为字符(36)。例如:
//在您的自定义类型中,公共int[] sqlTypes() { return new int[] { 1337 };}
//在您的自定义方言registerColumnType(1337,"char(36)")中
我还没有尝试过,但据报道它在Hibernate论坛上可以正常工作。
发布于 2014-04-17 19:48:18
如果不关心UUID在数据库中的表示方式(在本例中,它将以10为基数表示),还可以将UUID映射到UserType中的BigInteger (java.sql.Types.BIGINT)。
https://stackoverflow.com/questions/2007013
复制相似问题