【问题标题】:JPA: how to map SQL Server uniqueidentifier typeJPA:如何映射 SQL Server 唯一标识符类型
【发布时间】: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)

【问题讨论】:

标签: java sql-server hibernate


【解决方案1】:

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

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

您可以尝试使用@ColumncolumnDefinition 属性覆盖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;

这对我有用。

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2011-03-26
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多