38

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

@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
4

4 回答 4

50

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

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

如果您看这里,您会注意到所有这些都生成 type 的 id longshort或者int不是 type的 id String

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

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "PR_KEY")
private String prKey;
于 2013-09-04T20:04:57.350 回答
3

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

同样适用于具有生成 ID 的列。

于 2013-09-04T20:05:32.510 回答
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); 
于 2013-09-04T20:05:33.200 回答
0

通过在注释中使用strategy = "uuid"使用字符串作为主键的一种非常简单的方法@GenericGenerator(name = "system-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;
     
    //...
      
}
于 2021-10-02T18:54:07.670 回答