Frage

Es ist ganz etwas Zeit, dass ich versuche, dieses Problem herauszufinden und von googeln um viele Menschen haben ähnliche Probleme.

Ich versuche, ein Benutzer in einem sozialen Netzwerk zu modellieren, Hibernate, und was ist grundlegend für ein soziales Netzwerk als eine Freundschaft Beziehung abzubilden? Jeder Benutzer im System sollte eine Liste die es Freunde hat, und ich dachte, dass dies eine unglaublich einfache Aufgabe sein (um nur ManyToMany Beziehung verwenden, nicht wahr?). Also ging ich auf versuchen, die folgenden:

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null
}

Das Problem ist jetzt, dass es mir sagt, ich ManyToMany zu Unrecht durch keine klare Unterscheidung zwischen Freund und befreundeten mit. So weit so gut, bekomme ich den Fehler, aber wie kann ich das tun, was ich will?

Jede Idee? Ich habe das Ende meiner Weisheit erreicht.

War es hilfreich?

Lösung

Die Tatsache, über viele, viele ist, dass es ein wenig mehr Konfiguration muss, weil sein zwingend notwendig, dass Hibernate eine Beziehungstabelle erzeugt. Versuchen Sie folgendes:


@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   @JoinTable(name = "user_friends", 
       joinColumns = @JoinColumn(name = "user_id"), 
       inverseJoinColumns = @JoinColumn(name = "friend_id"))
   protected List friends = null;
   @ManyToMany(mappedBy = "friends")
   protected List befriended = null;
}

Hoffe, es funktioniert =)

EDIT: Auch sehr vorsichtig sein mit Typ holen ... können Sie einen Benutzer eines Out-of-Regelkreis zu holen und alle DB erhalten.

Andere Tipps

Die ManyToMany Anmerkung hat einen mappedBy Parameter. Ich denke, so etwas wie

@ManyToMany(mappedBy = "friends")

funktionieren könnte. sehen Auf jeden Fall die docs .

Edit:

Es scheint, als ob eine viele zu viele Beziehung von beiden Enden zugänglich sein muss. Derzeit liegt bei Ihnen nur von einem Ende zugänglich. Vielleicht sollten Sie die andere Beziehung als auch hinzufügen:

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null;
   @ManyToMany(mappedBy = "friends")
   protected List<User> befriended = null;
}

Wenn das nicht funktioniert, können Sie immer eine eigene Klasse einzuführen, um die Beziehung zwischen zwei Benutzern darstellt, und lassen Sie jeden Benutzer eine Sammlung von Instanzen dieser Klasse hat.

Guter Punkt, und in der Tat habe ich versucht, dass. Problem ist, dass ich dann eine Beschwerde erhalten über das mappedBy Attribut auf beiden Seiten der Beziehung gesetzt werden, was wahr ist, aber ungültig. Ich habe mich gefragt, ob ein einfaches @ManyToMany mit einiger cleveren benutzerdefinierten Abfrage, um die Freunde holen könnte eine Lösung sein: Die ManyToMany erzeugen würde eine Join-Tabelle mit user_id und friend_id, aber die Abfrage würde entweder der Felder, der Rückkehr alle Benutzer, wo das Spiel entweder die friend_id oder die user_id übereinstimmen, ist. Irgendwelche Ideen?

Das wäre natürlich eine gute Lösung, aber ich bin noch nicht vollständig verkauft. Im Grunde genommen, um die Freunde bekommen ich muss die beiden Sammlungen zusammenführen, was sehr unbefriedigend ist.

Gibt es absolut keine Möglichkeit, eine idempotent, reflexive Beziehung in Hibernate zu schaffen?

Ich hatte das gleiche Problem heute auch.

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null
}

Sollte in Ordnung sein, habe ich eine ähnliche Struktur. Aber ich habe ein träges Laden Ausnahmen und wenn die fetchType zu EAGER Einstellung, ich habe Beschwerden über rekursive Initialisierung von Taschen.

Wie kann ich mein Problem behoben: In der Abfrage verwenden Sie die ‚Benutzer‘ zu holen, so etwas wie:

from User as u left join fetch u.friends

Dies wird die Liste der Freunde für diese Entität initialisieren. Seien Sie gewarnt, dass es nicht initialisiert hat von diesen Freunden keine Freunde. Das ist eine gute Sache, eigentlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top