NullPointerException dans une jointure OneToOne Hibernate
19 juillet 2009 par: Benoit BonnevilleVous 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 :
- buildSessionFactory : d’une erreur lors de la création de la session hibernate
- secondPassCompile : la compilation des fichiers de mappings
- OneToOneSecondPass : il s’agit certaintement d’un shéma bidirectionnel
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 »