web-dev-qa-db-fra.com

Comment utiliser @Id avec le type de chaîne dans JPA / Hibernate?

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
26
Kailas

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

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.

3
Gyanendra Dwivedi

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); 
0
Mikko Maunu