2016-08-05 13 views
1

Ich habe mehr oder weniger so etwas wie dieses Setup mit Hibernate und h2/Postgres (beide sind nicht richtig funktioniert)Hibernate, @ManyToOne/@OneToMany, Kinder nicht hinzugefügt geholt mit Eltern

@Entity 
class A { 

    @Id 
    @GeneratedValue 
    long id; 

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    List<B> bs; 

} 

@Entity 
class B { 

    @Id 
    @GeneratedValue 
    long id; 

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    A a; 
} 

Jetzt gibt es @Transactional Repository mit den Methoden save/update/getAll/getById.

Mein Problem ist, wenn ich folgendes:

A a = new A(); 
save(a); 

B b = new B(); 
b.a = a; 
save(b); 

A anotherA = getById(a.id); 

Objekt namens "anotherA" hat keine B-Objekte in "bs" ein.

Sollte ich etwas tun, um etwas zu erreichen oder ist etwas nicht in Ordnung mit meinem Ansatz?

Darüber hinaus, wenn ich die letzte Zeile nach einiger Zeit aufrufen die bs gefüllt sind, so vermute ich, dass es möglicherweise ein Problem mit der Sitzung und ein Objekt, das dort gespeichert ist.

Antwort

1

Sie müssen sicherstellen, dass Sie auf beiden Seiten der Beziehung die Beziehung hatten die Anwendung wie wie folgt:

A a = new A(); 
session.save(a); 

B b = new B(); 
b.setA(a); 
a.getBList().add(b); 
session.save(b); 

Normalerweise diese Art von Code in verschiedenen Orten meiner Anwendung zu bringen, um zu vermeiden, ich in der Regel entlarfe eine Schauspieler-Methode, die diese Beziehung für mich verwaltet.

// a method inside B 
public void applyA(A a) { 
    // if B is currently related to A, break the relation 
    if (this.a != null) { 
    this.a.getBList().remove(this); 
    } 
    // apply the relation to both sides 
    this.a = a; 
    if (a != null) { 
    a.getBList().add(this); 
    } 
} 

Ähnlich könnte man eine ähnliche Methode A

public void applyB(B b) { 
    if (b != null && !this.bList.contains(b)) { 
    b.apply(this); 
    } 
} 
hinzufügen
Verwandte Themen