J'ai une entité qui contient la clé primaire de type chaîne. Ce modèle d'entité est le suivant:
@Entity
public class MyEntity {
@Id
@Column(name="PR_KEY", unique=true)
private String prKey;
....
....
}
Mais je suis confronté à un problème en disant TypeMismatch.
org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class Java.lang.String, got class Java.lang.Long
Si vous ne spécifiez pas de stratégie de génération d'ID, Hibernate utilisera GenerationType.AUTO
. Cela se traduira par l'un des
AUTO - soit colonne, séquence ou table d'identité selon la base de données sous-jacente.
Si vous regardez ici , vous remarquerez que tous ceux-ci génèrent des identifiants de type long
, short
ou int
, pas de type String
.
Supposons que vous vouliez un UUID String
comme identifiant, vous pouvez utiliser
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "PR_KEY")
private String prKey;
Vérifiez le type de données PR_KEY dans la table de base de données. Ce problème peut se produire si la colonne est de type Number et que vous essayez de la mapper à String dans votre entité.
Il en va de même pour le coulmn avec les ID générés.
Lorsque String est utilisé comme identifiant, le même type doit également être utilisé lors de la recherche d'entité via Session/EntityManager:
Au lieu de fournir Long:
Long key = 1L;
MyEntity me = session.get(MyEntity.class, key);
//or
MyEntity me = entityManager.find(MyEntity.class, key);
La chaîne doit être donnée:
String key = "1";
MyEntity me = session.get(MyEntity.class, key);
//or
MyEntity me = entityManager.find(MyEntity.class, key);