我有一个实体,其中包含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
答案 0 :(得分:37)
如果您未指定ID生成策略,Hibernate将使用GenerationType.AUTO
。这将导致任何
AUTO - 标识列,序列或表,具体取决于 基础DB。
如果你看here,你会发现所有这些long
,short
或int
生成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);