2010-11-25 5 views
3

Ich habe Probleme mit der Zusammenführung. Meine Update-Methode funktioniert auf diese Weise:[Ruhezustand] Verschmelzen vorübergehendes Objekt mit Kindern

void update(Parent parent) { 
    evict(parent); 
    merge(parent); 
} 

Meine Klassen:

Parent { 

    Long id; 

    List<Children> childrens; 

    @OneToMany(targetEntity =ChildrenImpl.class, fetch=FetchType.LAZY) 
    @JoinColumn(name="PARENT") 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    List<Children> getChildrens(){...} 

    @Id 
    Long getId() {...} 

} 



Children{ 

    Parent parent; 

    @ManyToOne(targetEntity = ParentImpl.class, fetch = FetchType.LAZY) 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    @JoinColumn(name = "PARENT", nullable = false) 
    Parent getParent(){...} 

} 

Wenn ich einen neuen Parent (transienten) Objekt erstellen und neue Kinder hinzu und aktualisiert Der Versuch (evict & merge) meldet sich dann zeigen ich dies nach bündig Hibernate Session:

INSERT PARENT //everythings here is ok. 

INSERT CHILDREN // but without parent id(id=null) 

Auftrag ist gut, aber Kinder Eltern-ID in Einsatz nicht haben. Alles funktioniert gut, wenn Parent in der Datenbank beibehalten wird, dann haben Kinder immer eine gute ID.

Irgendwelche Ideen, was ich tun soll, um ID von transientem Objekt zu erhalten (von persistiert ist ok).

Grüße KZ.

+0

Haben Sie versucht, die vorübergehende Instanz zuerst über session.saveOrUpdate() zu speichern, sodass eine ID an die Entität angehängt wird? Haben Sie einen Debugger eingecheckt, dass Ihre Entität eine ID hat, wenn die Einfügung für das untergeordnete Objekt ausgeführt wird? – fasseg

Antwort

2

Sie können keine ID von einem transienten Objekt erhalten, per Definition hat ein transientes Objekt keine ID.

Warum führen Sie eine Zusammenführung durch, wenn Sie ein neues Objekt erstellen? Wenn Sie ein neues Objekt erstellen, sollten Sie es speichern. Wenn Sie die Werte eines vorhandenen Objekts ändern, sollten Sie es aktualisieren. Sie sollten nur zusammenführen, wenn ein persistentes Objekt losgelöst wird und Sie es erneut anfügen müssen.

+0

Nehmen Sie dann den Fall eines sehr komplizierten Objektgraphen. Sagen wir, ich exportiere es in ein XML, mache eine Menge Änderungen und importiere es dann wieder. Es kann extrem schwierig und schwer zu pflegen sein, wenn man das vorhandene persistente Objekt dann mit dem alten und all seinen Kaskaden vergleichen muss Abhängigkeiten und aktualisieren Sie es. Stattdessen wäre es nett, ein transientes Objekt mit dem neuen zu erstellen, das Neue mit dem Alten zu vergleichen, IDs zu dem neuen Transientenobjekt hinzuzufügen, zu fusionieren und zu speichern. Das ist, was ich gerne tun würde, aber sagst du, dass das nicht möglich ist? – eipark

+0

Wie unterscheidet man zwischen einem neuen Objekt mit NotNull Id zu einem losgelösten Objekt? Es gibt keine Möglichkeit, denke ich. Also ist es in Ordnung, ein neues Objekt mit gesetzter ID zusammenzuführen. Wir können diese Logik haben, wenn unsere Entitäten unveränderlich sind - wir müssen dann ein neues Objekt erstellen. – ses