【问题标题】:How to use @Id with String Type in JPA / Hibernate?如何在 JPA / Hibernate 中使用 @Id 和字符串类型?
【发布时间】:2013-09-08 11:37:39
【问题描述】:

我有一个包含字符串类型主键的实体。这个实体模型如下:

@Entity
public class MyEntity {

@Id
@Column(name="PR_KEY", unique=true)
private String prKey;

....
....

}

但是我遇到了 TypeMismatch 的问题。

org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class java.lang.String, got class java.lang.Long

【问题讨论】:

  • 方法getPrKey()是如何定义的?你确定它返回一个String 对象吗?
  • 是的,它只返回字符串。
  • 有任何进展@Kailas 吗?奇怪的是,简单地拥有一个字符串 ID 似乎太难了。我也有同样的问题。
  • 我认为您在字段中使用了错误的 json 键。请记住,json 键始终是 java 类中提到的内容。不是列名。

标签: java hibernate jpa


【解决方案1】:

如果不指定 id 生成策略,Hibernate 将使用GenerationType.AUTO。这将导致任何

AUTO - 标识列、序列或表,具体取决于 底层数据库。

如果您查看here,您会注意到所有这些都生成longshortint 类型的ID,而不是String 类型。

假设你想要一个 String UUID 作为 id,你可以使用

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "PR_KEY")
private String prKey;

【讨论】:

  • 此键的值由我程序中的其他实体提供。我不希望它自动生成。我认为 GeneratedValue 注释会使其生成值。请纠正我
【解决方案2】:

检查数据库表中的 PR_KEY 数据类型。如果列是 Number 类型并且您尝试将其映射到实体中的 String,则可能会出现此问题。

同样适用于生成 Id 的列。

【讨论】:

  • 数据库中是VARCHAR2。
  • @Kailas 我也有类似的问题。你找到解决办法了吗?谢谢!
【解决方案3】:

当String用作id时,通过Session/EntityManager查找实体时也应使用相同的类型:

而不是提供 Long:

Long key = 1L;
MyEntity me = session.get(MyEntity.class, key); 
//or 
MyEntity me = entityManager.find(MyEntity.class, key); 

应该给出字符串:

String key = "1";
MyEntity me = session.get(MyEntity.class, key); 
//or 
MyEntity me = entityManager.find(MyEntity.class, key); 

【讨论】:

    【解决方案4】:

    通过在注解@GenericGenerator(name = "system-uuid", strategy = "uuid")

    中使用strategy = "uuid"来使用字符串作为主键的一种非常简单的方法

    这将生成一个唯一的 36 个字符的 id

    @Entity
    @Data
    @NoArgsConstructor
    public class ToDoClass {
    
        @NotNull
        @Id
        @GeneratedValue(generator = "system-uuid")
        @GenericGenerator(name = "system-uuid", strategy = "uuid")
        private String id;
         
        //...
          
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 2014-11-02
      • 2019-10-02
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      相关资源
      最近更新 更多