NullPointerException dans une jointure OneToOne Hibernate

19 juillet 2009 par: Benoit Bonneville

Vous avez NullPointerException at org.hibernate.cfg.OneToOneSecondPass.doSecondPass en voulant faire un mapping de jointure OneToOne avec hibernate en java.

Il s’agit certainement d’un problème de l’annotation mappedBy

Erreur rencontrée

Voici l’erreur Java en question générée lors de l’utilisation de la Classe en question qui est un mapping hibernate

[java.lang.NullPointerException|tag:java.lang.NullPointerException]
at org.hibernate.cfg.[OneToOneSecondPass|tag:OneToOneSecondPass].[doSecondPass|tag:doSecondPass](OneToOneSecondPass.java:135)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1163)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:316)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1319)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)

D’après le code d’erreur vous pouvez devinez qu’il s’agit de :

Partie du code concerné

Voici un extrait du code Java qui reproduit ce problème :

@Table(name="MA_TABLE")
public class MA_CLASS {

...
@OneToOne(mappedBy="MA_TABLE")
private OBJECT_JOIN objet;
...
}

Les lignes commençant par le caractère arobase, sont appelés des annotations.
Vous trouvez ici la déclaration de la Classe MA_CLASSE
Qui correspond à la table en base de donnée SQL nommée MA_TABLE
Cet objet est lié par jointure un-à-un avec l’objet OBJECT_JOIN

L’Erreur

L’annotation mappedBy= »MA_TABLE » contiens une valeur de MA_TABLE erronée, car en réalité il doit contenir l’attribut JAVA de l’objet join, et pas une valeur liée aux SQL.

Si l’object joins est de la Classe OBJECT_JOIN
et que dans cet object vous trouvez l’attribut maTableJointe qui est de type MA_CLASSE
et que cet attribut à l’annotation de la jointure

Alors vous devez écrire

mappedBy="maTableJointe"

En résumé

mappedBy doit avoir comme valeur l’attribut java de l’objet distant qui est lié par la jointure.

mappedBy est requis si vos objets sont bidirectionnels, c’est à dire que depuis chaque objet vous pouvez accéder à l’autre. le contraire est unidirectionnel, un seul objet peu accéder à l’autre, la réciproque étant impossible.

mappedBy est la réponse à la déclaration de la jointure qui doit contenir la clef étrangère pour savoir comment les deux objets sont liés
Voici le code de l’objet joint :

@OneToOne
@JoinColumn(name="field_foreign_key_in_database")

 »Nota Bene :
L’abréviation NPE veux dire NullPointerException »

Filed under: Développement

Répondre