2017-11-07 4 views
0

ausbreitende Ich habe folgendes 2 entites:unidirektional OneToMany mit zusammengesetzten Schlüsseln Kinder, nicht Eltern id

@Entity 
@Table(name = "PARENT") 
public class ParentEntity{ 
    @Id 
    @Column(name = "PARENT_ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "dtvSeq") 
    @SequenceGenerator(name = "dtvSeq", sequenceName = "PARENT_ID_SEQ") 
    private Long parentId; 

    @OneToMany(mappedBy = "childEntityPk.parentId", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    Collection<ChildEntity> childrenEntities; 

    //getters and setters ommited 

} 

Und die Kinder Einheit, mit einem zusammengesetzten Primärschlüssel, zum Teil PARENT_ID Referenzierung (fk):

@Entity 
@Table(name = "CHILDREN") 
public class ChildEntity { 
    @EmbeddedId 
    private ChildEntityPk childEntityPk; 

    //other fields 
    //getter and setters ommited 

    @Embeddable 
    private class ChildEntityPk implements Serializable{ 
     long parentId; 
     String name; 
    } 
} 

Es funktioniert perfekt zum Abrufen von Daten. Wenn ich jedoch eine ParentEntity und ihre untergeordneten Entitäten auf einmal beibehalten möchte, erhalte ich eine Ausnahme von Oracle.

Diese Ausnahme wird ausgelöst, weil Hibernate childEntity.childEntityPk.parentId nicht aktualisiert hat und versucht, null einzufügen.

Ich spielte auch mit @JoinColumn, aber ohne Erfolg.

Ich möchte kein bidirektionales Mapping haben.

+0

müssen Sie nicht mehr für '@ EmbeddedId' gehen. Sie können einfach mehrere Felder mit '@ Id' versehen, was den gleichen Effekt hat, aber Dinge wie' childEntityPk.parentId' löscht. Die Lösungen, die ich sehe, sind entweder eine bidirektionale Zuordnung, die Sie nicht möchten, oder Sie füllen die untergeordneten Entitäten mit der übergeordneten ID, bevor Sie – XtremeBaumer

+0

einfügen, was ist die Ausnahme? – Salman

+0

nur eine Oracle-Ausnahme, weil Hibernate versucht, Null in Parent-ID-Feld der Children-Tabelle, die nicht Nullable ist – chouk

Antwort

0

Haben Sie die addChild() -Methode oder aktualisieren Sie einfach die Sammlung? Ich schlage vor,

public void addChild(ChildEntity child) { 
    child.setChildEntityPk(this.parentId, "name"); 
    childrenEntities.add(child); 
} 
+0

yep das ist ein Weg, es zu tun, aber es sieht aus wie ein kleiner Hack. Ich hoffte auf einen Weg, den Winterschlaf automatisch machen zu lassen. – chouk

+0

@chouk Das ist nicht der Hack. Siehe das Dokument https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/example-parentchild.html –

0

Wenn Sie sagen, ich habe eine unidirektionale Beziehung zwischen ParentEntity haben wollen, und ChildEntity (von den Eltern auf die Kinder wahrscheinlich), Es bedeutet, dass die ParentEntity die Kinder weiß, aber die ChildEntity weiß nicht, wer ist sein Parrent. Nun zurück zu Ihrem Code, in dem ParentEntity erwähnten Sie

@OneToMany(mappedBy = "childEntityPk.parentId", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    Collection<ChildEntity> childrenEntities; 

es bedeutet, dass, wenn ich auf die ChildEntity gehen würde ich das Objekt childEntityPk.parentId sehen, die der Fremdschlüssel der Eltern ist.

Es ist falsch, wenn Sie unidirektionale Beziehung wollen. So entfernen Sie den mappedby


Zweitens:

wenn es unidirektional ist, brauchen Sie nicht eine ID des Mutter zu halten mit

@Embeddable 
    private class ChildEntityPk implements Serializable{ 
     long parentId; 
     String name; 
    } 

so bedeutet es, delet Alles in Ihrer ChildEntity Klasse

+0

@chouk was war das Feedback zu meiner Lösung? – Salman

Verwandte Themen