JPA:如何映射 SQL Server 唯一标识符类型

Posted

技术标签:

【中文标题】JPA:如何映射 SQL Server 唯一标识符类型【英文标题】:JPA: how to map SQL Server uniqueidentifier type 【发布时间】:2012-05-14 04:07:25 【问题描述】:

我继承了我试图通过 JPA 映射的 SQL Server 数据库。许多表都有uniqueidentifier 列。我正在尝试像这样映射它们:

@Id
@GenericGenerator(name = "generator", strategy = "guid", parameters = )
@GeneratedValue(generator = "generator")
@Column(name = "APPLICATION_ID")
private String id;

Hibernate 抱怨:

Found: uniqueidentifier, expected: varchar(255)

【问题讨论】:

相关:***.com/a/48918942/2102158 【参考方案1】:

POJO中主键属性的数据类型决定了其映射的DB列的数据类型,由Dialect类指定。根据hibernate提供的SQLServerDialect,它没有任何映射到uniqueidentifier的数据类型,String默认映射到varchar(255)

我认为String主键上的guid策略只意味着hibernate会为POJO的主键属性生成一个GUID值,并将这个生成的GUID值插入到varchar(255)列中以模拟@的效果987654334@

您可以尝试使用@Column 的columnDefinition 属性覆盖Dialect 类指定的映射

 @Id
 @GenericGenerator(name = "generator", strategy = "guid", parameters = )
 @GeneratedValue(generator = "generator")
 @Column(name = "APPLICATION_ID" , columnDefinition="uniqueidentifier")
 private String id;

【讨论】:

我说服我们的 DBA 转向基于整数的 PK,但在此之前,我应用了您的 columnDefinition="uniqueidentifier" 建议,该建议解决了类型不匹配问题。 也为我工作。请注意,我能够从@GenericGenerator 中删除“参数”参数,并从@Column 中删除“名称”。我不想覆盖这些值 =) 警告! GUIDGenerator 已弃用:使用 UUIDGenerator 而不是自定义 UUIDGenerationStrategy 实现。现在应该是@GenericGenerator(name = "generator", strategy = "uuid2")【参考方案2】:

你需要使用uuid2

@Id
@GenericGenerator(name = "generator", strategy = "uuid2", parameters = )
@GeneratedValue(generator = "generator")
@Column(name = "APPLICATION_ID" , columnDefinition="uniqueidentifier")
private String id;

这对我有用。

【讨论】:

以上是关于JPA:如何映射 SQL Server 唯一标识符类型的主要内容,如果未能解决你的问题,请参考以下文章

JPA SQL Server 没有 JDBC 类型的方言映射:-9

如何在唯一的映射或非对象 JPA 中返回多个结果

使用带有 Linq to Sql 的 Sql Server 唯一标识符/更新日期列 - 最佳方法

将 XML 文件导入 SQL Server 时唯一标识符转换失败

如何在 SQL Server 中添加标识列?

MySQL 使用 JPA + Hibernate 的 9 个高性能技巧