【问题标题】:Unknown integral data type未知的整数数据类型
【发布时间】:2017-09-27 10:35:26
【问题描述】:

我有一个具有以下 ID 规范的数据库:

code: VARCHAR(3) - 这是主键,一个最大的字符串 3个字符的长度

我正在通过以下方式映射 Id:

    @Id
    @GeneratedValue
    private String code;

我在尝试调用 session.save() 时收到此错误:

线程“main”中的异常 org.hibernate.id.IdentifierGenerationException:未知的整数数据 id 类型:java.lang.String

我错过了什么?

谢谢! :)

【问题讨论】:

  • 这意味着 GeneratedValue 应该是 Integer 而不是 java.lang.String
  • 生成id是什么意思?保存前的一些java代码?怀疑数据库..
  • 数据库规范说:“VARCHAR(3) - 这是主键,一个最大长度为3个字符的字符串”,所以它是一个字符串...

标签: java hibernate jpa hibernate-mapping hibernate-annotations


【解决方案1】:

使用普通的 @GeneratedValue 不会解决问题,因为它带有 GenerationType.AUTO 选项,它告诉持久性提供者自己决定策略,但如果是 String,它无法解决任何开箱即用的解决方案。

通常您会选择 uuid 自定义生成策略,但这会导致长度为 32 的字符串超出您的列可以处理的范围。

如果您真的想避免每次在保存之前手动设置 id,您可以利用 PrePersist 实体侦听器:

@PrePersist
private void generateCodeIdentifier(){
    setCode(/* Generate the unique code identifier */);
}

【讨论】:

  • 谢谢!我刚刚看了Hibernate不支持除uuid之外的String,有你刚才指出的问题。
【解决方案2】:
@GeneratedValue 

不能与 String 类型一起使用,因为它会返回 Integer 类型。所以,如果你想使用 String 作为 ID,你必须手动分配它。但是如果适合您的需要,可以使用 String 作为 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2021-04-12
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多