Update OneToMany Liste nach Entität speichern im Ruhemodus
habe ich Beziehung:
//In A.java class
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList;
//In B.java class
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_a")
@Cascade(CascadeType.SAVE_UPDATE)
private A a;
Nun suchen diese:
A a=new A();
//setting A
B b=new B();
//setting B
b.setA(a);
session.save(b); //this save b and a obviously
Nun das "problem":
- ein.getId() -> aktuelle new id OK
- ein.getBList() -> immer noch null...
So, warum bList ist nicht aktualisieren Sie in diesem Fall?
Habe ich versucht neu zu laden nach dem speichern, auf diese Weise:
A a=new A();
//setting A
B b=new B();
//setting B
b.setA(a);
session.save(b);
A loadedA=(A)session.get(A, a.getId());
Aber loadedA noch ein NULL-bList wie ein.
Natürlich zu vermeiden dieses problem, das ich in deinen Weg:
A a=new A();
//setting A
B b=new B();
//setting B
List<B> bList=new ArrayList<B>();
bList.add(b);
a.setBList(bList);
session.save(a); //this save a and b
In dieser Weise alle arbeiten gut, aber meine Frage ist:
Warum Id ist korrekt aktualisieren nach dem speichern-Vorgang und bList nicht?
Ich habe für db-Abfrage mit einer select-Anweisung, um neu zu laden, Eine Instanz richtig?
UPDATE
Habe ich diese Ausnahme
StaleStateException: Batch update
zurückgegeben unerwartete Zeilenanzahl von
update
wenn ich versuche, saveOrUpdate Person nach dem löschen von b aus.
//first delete old b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
a.getBList().remove(b);
b.setA(null);
session.delete(b);
//session.clear(); //this would solve my problem, but is it correct??
session.getTransaction().commit();
//then insert new b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
B b=new B();
a.getBList().add(b);
b.setA(a);
session.saveOrUpdate(a);
session.getTransaction().commit(); //this throw exception
diese operation zwei sind nicht in der gleichen Methode, die natürlich auch ausgelöst werden durch gui-event.
Sitzung.klar ist die wirkliche Lösung?
Im tun (wahrscheinlich) falsch?
update
entfernen session.löschen(b), das problem ist wieder gelöst... also, was ist die corretc Weg?
Ich weiß .. ich bin Total noob mit hibernate..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim arbeiten mit bi-direktionale Assoziationen, setzen Sie den link auf beide Seiten des Vereins:
Und tatsächlich, das gemeinsame Muster ist die Umsetzung der defensive link-management-Methoden wie diese:
Und der code wird zu:
Diese diskutiert wird in der Hibernate-Tutorial:
Oh... ok
Dieser Arbeit, die gute... ist das die Lösung, nicht wahr?