Arbeiten mit JPA 1 (Hibernate-Core-Version 3.3.0.SP1 und Hibernate-Entitymanager Version 3.4.0.GA): Ich habe einige Entitäten ähnlich denen unten definiert, wo ChildOne und ChildTwo erstreckt das Vater-Wesen.JPA-Vererbung
Sagen wir, ich habe eine Entität, die ein Vaterelement hat, und eine andere, die eine Sammlung von Vaterelementen hat. In beiden Fällen sollten die Kinder-Entitäten gehen.
@Entity
@Table(name = "TABLE_ONE")
public class OneTable {
@JoinColumn(name = "ID_PK", referencedColumnName = "ID_PK", nullable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Father element;
...
}
@Entity
@Table(name = "TABLE_ANOTHER")
public class Another {
@Fetch(FetchMode.JOIN)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id", fetch = FetchType.LAZY)
private Collection<Father> elementCollection;
...
}
Ich erwarte Elemente immer die Kinder zu bekommen, aber wenn ich das Element erhalten getElement()
den Vater Element und auf der anderen Seite zurückkehrt, wenn ich die Sammlung getElementCollection()
die Kinder Elemente bekommen kommen.
Anscheinend ist die @JoinColumn
die Ursache für dieses Verhalten, die Verbindung mit der Vater-Tabelle zu tun und die Kinder-Elemente zu vergessen. Die Sammlung funktioniert wie erwartet.
Wie kann ich das Kinderelement mit einem getElement()
Anruf erhalten? Irgendwelche Ideen oder Workarround? Vielen Dank im Voraus.
Guter Punkt. Lassen Sie mich ein paar Dinge ausprobieren und ich werde Sie wissen lassen ... – elcadro
Nur ein paar Anmerkungen zu Ihrer Antwort ... Soweit ich weiß, erfordert die Spezifikation keine Implementierung, um Diskriminator-Spalten zu verwenden, um JOINED-Vererbung zu implementieren. die Annahme ist, dass, wenn @DiscriminatorColumn angegeben ist, es verwendet werden würde ... Auf der anderen Seite, obwohl Ihre Lösung tatsächlich funktioniert, noch einige Zweifel haben. Wenn Sie wissen, dass die Lazyness Proxys zurückgibt, warum gibt ManyToOne einen Proxy an den übergeordneten (jpa.inheritance.issue.Parent _ $$ _ javassist_1) und die OneToMany-Auflistung untergeordnete Proxys (jpa.inheritance.issue.ChildOne _ $$ _ javassist_1) zurück? – elcadro
Der genaue Rückgabetyp des Aufrufs 'getElement()' in einer realen Anwendung ist nicht deterministisch.Wenn das Objekt im Cache der ersten oder zweiten Ebene gefunden wird, wird "Kind" eingegeben. Deshalb rufe ich 'em.clean()' in der Mitte auf - um das spezifische Verhalten zu bestimmen. Aus diesem Grund ist es am besten, in Situationen mit Eltern-Kind-Hierarchie typunabhängig zu sein. Wenn Sie wirklich einen korrekten Typ benötigen, können Sie "unproxy" wie ich vorgeschlagen habe oder besser FetchType zu EAGER ändern (als "unproxying" laden Sie die Beziehung trotzdem). – zbig