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

时间:2013-09-04 19:57:46

标签: java hibernate jpa

我有一个实体,其中包含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

3 个答案:

答案 0 :(得分:37)

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

  

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

如果你看here,你会发现所有这些longshortint生成ID,而不是String类型。

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

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

答案 1 :(得分:3)

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

同样适用于生成ID的coulmn。

答案 2 :(得分:0)

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