Ich verwende Hibernate mit Anmerkungen (im Frühjahr), und ich habe ein Objekt, das eine geordnete, viele-zu-eins-Beziehung hat, die ein untergeordnetes Objekt hat, das einen zusammengesetzten Primärschlüssel hat, von dem eine Komponente ein Fremdschlüssel ist auf die ID des übergeordneten Objekts.@ OneToMany und zusammengesetzte Primärschlüssel?
Die Struktur sieht wie folgt aus:
+=============+ +================+
| ParentObj | | ObjectChild |
+-------------+ 1 0..* +----------------+
| id (pk) |-----------------| parentId |
| ... | | name |
+=============+ | pos |
| ... |
+================+
ich eine Vielzahl von Kombinationen von Annotationen versucht haben, von denen keine zu funktionieren scheint. Dies ist die nächste, die ich habe in der Lage zu kommen mit:
@Entity
public class ParentObject {
@Column(nullable=false, updatable=false)
@Id @GeneratedValue(generator="...")
private String id;
@OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
@IndexColumn(name = "pos", base=0)
private List<ObjectChild> attrs;
...
}
@Entity
public class ChildObject {
@Embeddable
public static class Pk implements Serializable {
@Column(nullable=false, updatable=false)
private String parentId;
@Column(nullable=false, updatable=false)
private String name;
@Column(nullable=false, updatable=false)
private int pos;
@Override
public String toString() {
return new Formatter().format("%s.%s[%d]", parentId, name, pos).toString();
}
...
}
@EmbeddedId
private Pk pk;
@ManyToOne
@JoinColumn(name="parentId")
private ParentObject parent;
...
}
ich dies kam nach einem langen Kampf des Experimentierens, in denen die meisten meiner anderen Versuchen ergaben Einheiten, die Hibernate nicht einmal aus verschiedenen Gründen nicht laden .
UPDATE: Vielen Dank für die Kommentare; Ich habe Fortschritte gemacht. Ich habe ein paar Verbesserungen vorgenommen und denke, dass es näher ist (ich habe den obigen Code aktualisiert). Jetzt ist das Problem jedoch beim Einfügen. Das übergeordnete Objekt scheint sich gut zu speichern, aber die untergeordneten Objekte werden nicht gespeichert. Was ich feststellen konnte, ist, dass der Ruhezustand den parentId-Teil des (zusammengesetzten) Primärschlüssels der untergeordneten Objekte nicht ausfüllt. m immer einen nicht-eindeutigen Fehler:
org.hibernate.NonUniqueObjectException:
a different object with the same identifier value was already associated
with the session: [org.kpruden.ObjectChild#null.attr1[0]]
ich die name
und pos
Attribute in meinem eigenen Code bevölkern, aber natürlich weiß ich nicht, die übergeordnete ID, weil sie noch nicht gespeichert wurden. Irgendwelche Ideen, wie man überwintern kann, um das auszufüllen?
Danke!
Viel Glück. Ein Projekt, auf dem ich war, musste aufgrund der schlechten Unterstützung durch Hibernate Composite-Schlüssel zugunsten synthetischer Schlüssel vollständig aufgeben. –
Die Ausnahme kann durch die Verwendung von List <> verursacht werden. Sie müssen Set <> verwenden, um die Duplizierung der Schlüssel zu vermeiden, indem Sie hashCode und equals definition verwenden. Hibernate behandelt zwei "logisch identische" Elemente in einer Liste als zwei Elemente und verursachte dann die Ausnahme. – Popeye