Hinzufügen einer Entität zu einer großen Viele-zu-Viele-Beziehung in JPA

8

Ich habe eine Gruppenentität mit einer Liste von Benutzerentitäten in einer Viele-zu-Viele-Beziehung. Es wird von einer typischen Join-Tabelle abgebildet, die die beiden IDs enthält. Diese Liste kann sehr groß sein, eine Million oder mehr Benutzer in einer Gruppe.

Ich muss der Gruppe einen neuen Benutzer hinzufügen, normalerweise so etwas wie

%Vor%

Wenn ich die typische JPA-Operation verstehe, müssen Sie dann die gesamte Liste von 1 Million + Benutzern in die Sammlung ziehen, um den neuen Benutzer hinzuzufügen und dann zu speichern? Das klingt für mich nicht sehr skalierbar.

Soll ich diese Beziehung in JPA einfach nicht definieren? Sollte ich die Join-Tabelleneinträge direkt in einem Fall wie diesem manipulieren?

Bitte verzeihen Sie die lockere Syntax, ich benutze tatsächlich Spring Data JPA, also verwende ich den Entity Manager nicht direkt sehr oft, aber die Frage scheint für JPA generell zu sein, also wollte ich es so darstellen.

    
nfdavenport 20.09.2013, 05:12
quelle

3 Antworten

4

Entwerfen Sie Ihre Modelle so und spielen Sie mit UserGroup nach Assoziationen.

%Vor%

Mach das so.

%Vor%     
Prabhakaran 20.09.2013, 05:34
quelle
0

Die von getUsers() und getGroups() zurückgegebenen Auflistungsklassen müssen ihren Inhalt nicht im Speicher residieren, und wenn Sie faziles fetching aktiviert haben, nehme ich an, dass Sie für eine so große Beziehung den Persistenzanbieter verwenden sollte schlau genug sein, um zu erkennen, dass Sie nicht versuchen, den Inhalt zu lesen, sondern einfach einen Wert hinzufügen. (In ähnlicher Weise verursacht das Aufrufen von size() für die Auflistung in der Regel eine Abfrage SQL COUNT , anstatt die Elemente tatsächlich zu laden und zu zählen.)

    
chrylis 20.09.2013 05:20
quelle
0

Wenn Sie die ManyToMany-Zuordnung effektiv verwenden, wird die Auflistung in der Entität zwischengespeichert, sodass Sie dies möglicherweise nicht für große Auflistungen tun möchten, da das Anzeigen der Entität oder das Übergeben der Entität mit der ausgelösten Entity die Leistung beeinträchtigt.

Stattdessen können Sie die Zuordnung auf beiden Seiten entfernen und eine Entität für die Beziehungstabelle erstellen, die Sie in Abfragen verwenden können, wenn Sie auf die Beziehung zugreifen müssen. Wenn Sie eine intermediäre Entität verwenden, können Sie Paging und Cursor verwenden, sodass Sie die Daten, die möglicherweise in verwendbare Chunks zurückgebracht werden, einschränken und eine neue Entität einfügen können, um neue Beziehungen mit Leichtigkeit darzustellen.

EclipseLinks Attributänderungsprotokollierung ermöglicht zwar das Hinzufügen zu Sammlungen, ohne dass die Beziehung ausgelöst werden muss, sowie andere Leistungsverbesserungen. Dies ist beim Weben möglich und bei Sammlungsarten verfügbar, die die Reihenfolge nicht beibehalten.

    
Chris 20.09.2013 14:55
quelle

Tags und Links