Ich habe 3 Entitäten.Doppelte verknüpfte Entitäten, die für die übergeordnete Entität abgerufen wurden
- Request
- RequestDetail
- RequestDetailResponse
Request ist einer von vielen RequestDetails (RD vielen einem RH)
RequestDetail ist eines von vielen RequestDetailResponse (RDH vielen einem RD)
Hier sind die Beziehungsdefinitionen:
Request -> RequestDetail (das Feld beachten Sie wird als Sammlung mehr, auf dem später erklärt)
@OneToMany(mappedBy = "requestHeader", fetch = FetchType.EAGER)
Collection<RequestDetail> requestDetails = new HashSet<>();
RequestDetail -> Request
@ManyToOne
@JoinColumn(name="requestHeaderID")
private RequestHeader requestHeader;
RequestDetail -> DetailResponse
@OneToMany(mappedBy = "requestDetail", fetch = FetchType.EAGER)
Set<DetailResponse> detailResponses = new HashSet<>();
DetailResponse -> AnfrageDetail
Meine Frage: Wenn ich eine Sammlung von RequestDetails von einer RequestHeader-Entität (über einen öffentlichen Getter) erhalte, erhalte ich "doppelte" RequestDetails. Wenn man mit sql herumspielt, scheint es, dass die "extra" -Details die Verbindung mit den DetailResponses widerspiegeln. Was bedeutet, dass zum Beispiel
SELECT * FROM RequestHeader rh INNER JOIN RequestDetail rd on rd.RequestHeaderID = rh.RequestHeaderID
kehrt, sagen wir, 5 Aufzeichnungen, wo als
SELECT * FROM RequestHeader rh INNER JOIN RequestDetail rd on rd.RequestHeaderID = rh.RequestHeaderID INNER JOIN DetailResponse drs on drs.RequestDetailID = rd.RequestDetailID
kehrt, sagen wir, 10, wegen der vielen zu einer DetailResponse Expansion
Als ich das bekommen Sammlung von RequestDetails von meinem RequestHeader-Objekt, bekomme ich eine Größe 10 Sammlung. Wenn ich nun das Feld "RequestDetails" auf der RequestHeader-Entität als Set und nicht als Sammlung deklariere, vermeide ich dieses Problem, aber ich denke, seit ich einen Primärschlüssel für die RequestDetail-Entität definiert habe, sollte die JPA-Verwaltung intelligent genug sein zu wissen, dass es in diesem Zusammenhang kein Duplikat geben kann. Was ich falsch verstanden habe? Verwenden Sie eine Set-Deklaration, um den richtigen Weg zu finden?
Übrigens sind meine Primärschlüssel-Deklarationen, falls sie signifikant sind.
Request:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer requestHeaderID;
RequestDetail:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer requestDetailID;
DetailResponse:
@Id
@TableGenerator(name="DetailResponseStore", table="PRIMARY_KEYS",
pkColumnName = "KEY_NAME", pkColumnValue = "DETAIL_RESPONSE", valueColumnName = "NEXT_VALUE", initialValue = 1, allocationSize = 1)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "DetailResponseStore")
private Integer detailResponseID;
Übrigens verstehe ich im Hibernate-Beispiel nicht, warum sie die Duplizierung der Verwendung von Left Outer Joins zuschreiben. ein innerer Join, würde die gleiche Ergebnismenge (5X3 = 15) mit den Duplikaten erzeugen, da es keine baumelnden Tupel von der Order-Relation gibt, was ist der Linkout-Join, der zu den Resultaten über den inneren Join hinzugefügt wird? – naftalimich