2014-07-17 4 views
0

Disons que j'ai ces relations d'hibernation.TransientPropertyValueException après avoir enregistré le parent avec un enfant créé

class A{ 
    @OneToOne(orphanRemoval = true, cascade = {CascadeType.ALL}) 
    @JoinColumn(name = "b_id", nullable = false) 
    @Getter 
    @Setter 
    @XmlElement 
    private B b; 
} 

Et cet autre

class B{ 
    @OneToOne 
    @JoinColumn(name = "a_id") 
    @Getter @Setter 
    @XmlTransient 
    private A a; 

    } 

Dans un moment donné, je veux sauver ma classe A, est la première fois ne si existe pas sur la base de données encore, « mais » B existent déjà, car a été enregistré dans une autre transaction avant mais pas sur Cascade par A, donc la relation avec A sur la table B est toujours nulle. Maintenant, avec cette configuration actuelle, je reçois cette exception. Donc, quelle configuration sur A je dois faire pour persister A, et mettre dans B la relation avec A ?.

Cordialement.

+0

Pour 'OneToOne' mise en correspondance bidirectionnelle,' @ JoinColumn' devrait inclure au côté propriétaire seulement. –

Répondre

0

Tout d'abord, vous avez cartographié votre association deux fois. Si B est du côté du propriétaire que vous devez marquer l'autre extrémité avec mappedBy:

class A{ 
    @OneToOne(mappedBy="a", orphanRemoval = true, cascade = {CascadeType.ALL}) 
    @Getter 
    @Setter 
    @XmlElement 
    private B b; 
} 

Alors ceci est l'ordre étape par étape des opérations:

  1. Vous devez chercher B premier

    B b session.get(B.class, 1L); 
    
  2. Vous créez un

    A a = new A(); 
    
  3. Vous définissez les deux côtés de l'association

    a.b = b; 
    b.a = a; 
    
  4. Vous persistez un

    session.persist(a); 
    
+0

Est ce que je fais et rien, même erreur. Et j'essaie juste avec les types de cascade MERGE et DELETE mais toujours sam error – paul

+0

Je vois que vous n'avez pas utilisé mappedBy pour l'une des associations. Vérifiez ma réponse mise à jour. –

Questions connexes