如何在JPA / Hibernate中使用带字符串类型的@Id?

我有一个实体,其中包含string类型的主键。 该实体模型如下:

@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 

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

AUTO – 标识列,序列或表,具体取决于基础DB。

如果你看这里 ,你会注意到所有这些生成id类型为longshortint ,而不是String类型。

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

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

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

同样适用于生成的Ids的coulmn。

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

而不是提供龙:

 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);