我有一个像这样的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,我很感激。答案 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)。