JPA mit Hibernate 3 - ManyToMany-Stack overflow und Mehrere bag-Fehler
Bin ich Probleme beim abrufen von Daten für Personen, die bidirektionale viele-zu-viele-Beziehung. Wenn ich List
für die Speicherung der Entitäten, bekomme ich nicht in der Lage zu Holen, mehrere Taschen gleichzeitig Fehler. Wenn ich meinen code zu verwenden Set
bekomme ich stackoverflow Fehler.
Details :
- Spring 3.0.3
- Hibernate-core : 3.5.1-Final
- Hibernate-annotations : 3.5.1-Final
- hibernate-common-Anmerkungen : 3.2.0-Final
- hibernate-entitymanager : 3.5.1-Final
- Mysql-Datenbank
- Junit 4
Benutzer hat Viele Bankkonten, Bank-Konto, können viele Benutzer haben
User.java
@ManyToMany(fetch = FetchType.EAGER, mappedBy="user")
private List<BankAccount> bankAccounts = new ArrayList<BankAccount>();
BankAccount.java
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_bankaccount",
joinColumns = @JoinColumn(name="bank_account_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> user = new ArrayList<User>();
DB-Tabellen
Users
user_id PK
Bankaccount
bank_account_id PK
user_bankaccount
bank_account_id PK ( references bankaccount.bank_account_id )
user_id PK ( references user.user_id )
Fragen
- wenn ich versuche, um alle Benutzer-Daten (
getAllUsers
) mit Hilfe eines JUnit test case, die ich bekomme nicht in der Lage zu Holen, mehrere Taschen gleichzeitig Fehler. - Wenn ich
Set
undHashSet
statt der Liste undArrayList
beziehungsweise, ich bekomme stackoverflow Fehler.
Bitte helfen Sie mir und lassen Sie mich wissen, wenn der code falsch ist, oder Ihr einen bekannten Ruhezustand-Problem mit bestimmten version der libs, die ich verwende.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe konfrontiert, die das ähnliche Problem und die Ursache ist ein Lombok generation-code als Vjeetje oben erwähnt. Mein code nutzt die annotation @Data, die generiert den hashCode und ToString-Methoden mit cross-abhängige Felder, und diese Struktur führt zu Überwintern stecken. So sollte man darauf, dass diese endlos-Schleife Aufrufe, in meinem Fall habe ich nur noch den Ausschluss von Parametern, wie @EqualsAndHashCode(exclude="dependent_list") und @ToString(exclude = "dependent_list"). Es löst stack-overflow-Problem.
(Lassen wir die
fetch
Attribut beiseite für jetzt). Dein mapping ist vollkommen gültig und ist der richtige Weg, um Karte eine bidirektionale viele-zu-viele-Beziehung. Von der JPA 2.0 Spezifikation:Dass gesagt wird, ich bin mir nicht sicher, das Verhalten bei der Verwendung
EAGER
Holen auf beiden Seiten (führt zu einem unendlichen Kreislauf?), der JPA-Spezifikation ist ziemlich verschwommen dazu und ich finde keine klare Erwähnung, dass es verboten ist. Aber ich Wette, es ist ein Teil des Problems.Aber in dem besonderen Fall von Hibernate, würde ich erwarten, dass Hibernate in der Lage sein zu handhaben Zyklen wie bereits in dieser Kommentar von Emmanuel Bernard:
Lustigerweise habe ich beantwortet eine sehr ähnliche Frage vor kurzem (ganz in der Nähe-problem). Vielleicht ein Hinweis, dass etwas falsch ist in Ruhezustand (mein Verständnis von dem obigen Kommentar ist, dass mit EAGER-fetching-auf beiden Seiten sollte funktionieren).
Ich werde damit schließen, meine Antwort auf die gleiche Weise: , wenn Sie eine test-Fall erlaubt, das problem zu reproduzieren, öffnen Sie ein Jira-issue.
Können Sie nicht anzeigen, die viele zu vielen Beziehung auf die beiden Listen, hibernate wird dann versuchen, Holen Sie sich eine Sammlung für jedes verschachtelte element, d.h. jeder Benutzer in der Liste Benutzer hat eine Liste der Bankkonten, die eine Liste der Benutzer... . denke es ist eine nie endende Rekursion.