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
使用带有 Linq to Sql 的 Sql Server 唯一标识符/更新日期列 - 最佳方法