java sqlserver uuid_java – 使用PostgreSQL和SQL Server的Hibernate UUID

我有类似的要求,但我也想使用Hibernate DDL生成并确保SQL Server生成一个uniqueidentifier类型,并且还希望支持hsqldb进行单元测试.

要在SQL Server中使用UUID,您肯定希望通过字符串而不是二进制,因为SQL Server中的二进制表示是针对与UUID不同的GUID.参见例如

Different representation of UUID in Java Hibernate and SQL Server

您可以使用以下命令创建正确的映射并为SQL Server生成正确的sql:

@Type(type = "uuid-char")

@Column(columnDefinition="uniqueidentifier")

public UUID getUuid()

这只是按原样运行,但不幸的是,Hibernate没有办法为不同的数据库使用不同的columnDefinitions,因此除了SQL Server之外,这将失败.

所以,你必须走很远的路.这完全适用于Hibernate 4.3:

>在重写的SQLServerDialect中注册新的GUID sql类型,并使用此方言而不是基础方言

public class SQLServer2008UnicodeDialect extends SQLServer2008Dialect

{

public SQLServer2008UnicodeDialect()

{

// the const is from the MS JDBC driver, the value is -145

registerColumnType( microsoft.sql.Types.GUID, "uniqueidentifier" );

// etc. Bonus hint: I also remap all the varchar types to nvarchar while I'm at it, like so:

registerColumnType( Types.CLOB, "nvarchar(MAX)" );

registerColumnType( Types.LONGVARCHAR, "nvarchar(MAX)" );

registerColumnType( Types.LONGNVARCHAR, "nvarchar(MAX)" );

registerColumnType( Types.VARCHAR, "nvarchar(MAX)" );

registerColumnType( Types.VARCHAR, 8000, "nvarchar($l)" );

}

}

>创建一个包装器UUIDCustomType,其行为类似于内置的UUIDCharType,但是根据数据库类型进行委托.您需要在Hibernate配置之前调用init(databaseType).也许自定义方言可以做到,但我在我的Spring应用程序启动时称之为.

DatabaseType是我已经根据系统配置设置的枚举,使用方言类或字符串或其他来修改它.

public enum DatabaseType

{

hsqldb,

sqlserver,

mysql,

postgres

}

public class UUIDCustomType extends AbstractSingleColumnStandardBasicType implements LiteralType

{

private static final long serialVersionUID = 1L;

private static SqlTypeDescriptor SQL_DESCRIPTOR;

private static JavaTypeDescriptor TYPE_DESCRIPTOR;

public static void init( DatabaseType databaseType )

{

if ( databaseType == DatabaseType.sqlserver )

{

SQL_DESCRIPTOR = SqlServerUUIDTypeDescriptor.INSTANCE;

}

else if ( databaseType == DatabaseType.postgres )

{

SQL_DESCRIPTOR = PostgresUUIDType.PostgresUUIDSqlTypeDescriptor.INSTANCE;

}

else

{

SQL_DESCRIPTOR = VarcharTypeDescriptor.INSTANCE;

}

TYPE_DESCRIPTOR = UUIDTypeDescriptor.INSTANCE;

}

public UUIDCustomType()

{

super( SQL_DESCRIPTOR, TYPE_DESCRIPTOR );

}

@Override

public String getName()

{

return "uuid-custom";

}

@Override

public String objectToSQLString( UUID value, Dialect dialect ) throws Exception

{

return StringType.INSTANCE.objectToSQLString( value.toString(), dialect );

}

public static class SqlServerUUIDTypeDescriptor extends VarcharTypeDescriptor

{

private static final long serialVersionUID = 1L;

public static final SqlServerUUIDTypeDescriptor INSTANCE = new SqlServerUUIDTypeDescriptor();

public SqlServerUUIDTypeDescriptor()

{

}

@Override

public int getSqlType()

{

return microsoft.sql.Types.GUID;

}

}

}

>在Hibernate将要获取的位置注册自定义类型(我有一个适用于所有实体的公共基类).我使用defaultForType = UUID.class注册它,以便所有UUID都使用它,这意味着我根本不需要注释UUID属性.

@TypeDefs( {

@TypeDef( name = "uuid-custom", typeClass = UUIDCustomType.class, defaultForType = UUID.class )

} )

public class BaseEntityWithId {

警告:实际上没有使用postgres进行测试,但是对于Hibernate 4.3上的hsqldb和sql server非常有用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值