Hibernate rekursive viele-zu-viele-Assoziation mit der gleichen Person
Anderen Hibernate-Frage... 😛
Einsatz von Hibernate die Kommentare Rahmen, ich habe eine User
Einheit. Jeder User
haben kann, eine Sammlung von Freunden: eine Sammlung von anderen User
s. Allerdings habe ich nicht in der Lage gewesen, um herauszufinden, wie das erstellen einer Viele-zu-Viele-Assoziation innerhalb der User
Klasse, bestehend aus einer Liste von User
s (mit user-Freunde-intermediate-Tabelle).
Hier ist die User-Klasse und Ihre Anmerkungen:
@Entity
@Table(name="tbl_users")
public class User {
@Id
@GeneratedValue
@Column(name="uid")
private Integer uid;
...
@ManyToMany(
cascade={CascadeType.PERSIST, CascadeType.MERGE},
targetEntity=org.beans.User.class
)
@JoinTable(
name="tbl_friends",
joinColumns=@JoinColumn(name="personId"),
inverseJoinColumns=@JoinColumn(name="friendId")
)
private List<User> friends;
}
Den Benutzer-Freund-mapping-Tabelle hat nur zwei Spalten, die beide Fremdschlüssel zu den uid
Spalte der tbl_users
Tabelle. Die beiden Säulen sind personId
(die Karte für den aktuellen Benutzer), und friendId
(gibt die id des aktuellen Benutzers Freund).
Das problem ist, das die "Freunde" - Feld kommt immer null aus, obwohl ich bereits aufgefüllt, die Freunde-Tabelle, so dass alle Benutzer im system sind Freunde mit allen anderen Nutzern. Ich habe sogar versucht die Umschaltung der Beziehung zu @OneToMany
, und es kommt immer noch null (obwohl das Hibernate-debug-Ausgabe zeigt eine SELECT * FROM tbl_friends WHERE personId = ? AND friendId = ?
Abfrage, aber sonst nichts).
Irgendwelche Ideen, wie zum ausfüllen dieser Liste? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
@ManyToMany selbst ist eher verwirrend, weil die Art und Weise, die Sie würde normalerweise dieses Modell unterscheidet sich von der "Ruhezustand" Weg. Dein problem ist, du bist fehlt noch eine Sammlung.
Denken Sie an es auf diese Weise - wenn Sie eine Zuordnung "Autor" /"Buch" als " viele-zu-viele -, müssen Sie die "Autoren" Sammlung auf Buch und "Bücher" - Sammlung auf Autor. In diesem Fall, Ihre "Benutzer" Körperschaft beiden enden einer Beziehung, so müssen Sie die "meine Freunde" und "Freund" Sammlungen:
Können Sie immer noch die gleiche Assoziation Tisch, aber beachten Sie, dass join /inverseJon Spalten vertauscht werden, die auf Sammlungen.
Den "Freunden" und "friendOf" Sammlungen kann oder nicht entsprechen kann (je nachdem, ob die "Freundschaft" ist immer gegenseitig) und Sie nicht haben, um setzen Sie Sie auf diese Weise in der API natürlich, aber das ist der Weg, um anzeigen im Ruhezustand.
Eigentlich ist es sehr einfach und könnte erreicht werden, indem Folgendes sagen, Sie haben folgenden Unternehmen
HBM für gleichen:
- Und test-Fall
Akzeptiert die Antwort scheint zu kompliziert mit der
@JoinTable
Anmerkungen. Eine etwas einfachere Implementierung benötigt nur einemappedBy
. MitmappedBy
zeigt den BesitzEntity
oder Eigenschaft, die sollte wohl diereferencesTo
denn das würde als "Freunde". EinManyToMany
Beziehung kann eine sehr komplizierte Graphen. MitmappedBy
macht der code etwa so:Und es verwenden, müssen Sie erwägen, den Besitz von Immobilien ist der
referencesTo
. Sie müssen nur die Beziehungen in dieser Eigenschaft, damit Sie referenziert werden. Wenn Sie Lesen eineEntity
zurück, sofern Sie einefetch join
, JPA erstellen die Sammlungen für das Ergebnis. Wenn Sie eine Entität löschen, JPA wird, löschen Sie alle Verweise auf Sie.Welche gibt die folgende log-Ausgabe (immer überprüfen Sie die generierten SQL-Anweisungen):