2012-03-29 11 views
1

Ich verwende:JPA one to many/viele, viele Beispiel

  • Hibernate
  • MySQL
  • jBoss

Ich habe eine Anwendung zu erstellen, die Benutzer Freundschaft machen können .

Ich bin immer noch in Entwurfsphase, und ich möchte diese Tabellen haben:

- User {_id, name, address} 
- Friendship {idUserA, idUserB, date} 

Für meine Zwecke sollte ich von Benutzern eine gegenseitige Beziehung haben. Zum Beispiel 1 ist der Freund von 2 und indirekt 2 ist der Freund von 1.en Also in meinem Tisch denke ich habe:

Freundschaft = {1, 2, ...}

Ich frage, wie ich kann dieses Verhalten simulieren. Ich habe sein Thema gelesen: Many-to-many on the same table with additional columns und ich habe diese Anweisung zum Generieren von Datenbanktabellen von Entität (Eigenschaft von Hibernate) gefolgt. Aber in diesem Beispiel, wenn ich meinen Freund A lade, habe ich eine Liste mit Freund B und wenn ich B lade, habe ich keinen Benutzer A in Liste.

Wie kann ich diese verdammte gegenseitige Beziehung implementieren?

+0

Können Sie einen Beispielcode geben, wie Sie Ihre Entitätsklassen entworfen haben? – magomi

+0

Ich kopiere direkt von: http://stackoverflow.com/questions/1831186/many-to-many-on-the-same-table-with-additional-columns von Arthur Ronald FD Garcia – CeccoCQ

Antwort

1

Soweit ich dieses Beispiel verstehe, ist die Gegenseitigkeit nicht implizit. Ich

@OneToMany(mappedBy="myFriends") 
private List<MyFriends> myFriends; 

@OneToMany(mappedBy="me") 
private List<MyFriends> iAmFriendOf; 

... 

Set<MyFriends> getFriends() { 
    Set<MyFriends> friends = new HashSet<MyFriends>(); 
    friends.addAll(myFriends); 
    friends.addAll(iAmFriendOf); 
    return friends; 
} 
0

Eigentlich: haben Freundschaft Beziehung von A> B und B-> A Sie müssen entweder zwei Einträge in die Tabelle hinzuzufügen, oder Sie müssen zwei Sätze implementieren und eine Kreuzung der beiden Liste zurück Ich bin kein großer Fan von OneToMany und besonders ManyToMany Beziehungen. Ich bevorzuge einen anderen Tisch wie Freundschaft, wie du es getan hast. Soweit ich verstehe, vermischen Sie sich mit Ansätzen. Für mich einfachste Weg, um eine Freundschaft Tabelle ist mit und alles, was Sie in dieser Tabelle brauchen, ist Spiel zwei Freunde so gestaltet sein könnte:

@Entity 
public class User{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @Column 
    private String name; 

    @Column 
    private String address; 

} 

@Entity 
public class Friendship { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @ManyToOne 
    @JoinColumn(name="friend_requester_id") 
    private User friendRequester; 

    @ManyToOne 
    @JoinColumn(name="friend_accepter_id") 
    private User friendAccepter; 

    private Date date; 

} 

Wenn Freunde Auflistung entweder Sie könnten Freundschaften Liste -wie sie eine andere Tabellen- oder Freunde sind mit dieser Tisch. Es ist jedoch ein bisschen schwierig, wenn Sie nur Freunde auflisten möchten, aber nicht so schwer. Sie konnten getFriends(List<Friendship> friendships, int userId) Methode und eine Liste Freunde wie haben:

List<User> friends ... 

    Iterator iterator = friendships.iterator(); 
    while (iterator.hasNext()) { 
    Friendship friendship = (Friendship) iterator.next(); 
    if (friendship.getFriendRequester().getId != userId) { 
     friends.add(friendship.getFriendRequester); 
    } else { 
     friends.add(friendship.getFriendAccepter); 
    } 
    } 

    return friends; 

Ein weiterer Vorteil dieser Implementierung können Sie unterscheiden, die später ein Freund zu sein angefordert (wenn es gebraucht wird).

Meiner Meinung nach, ja, es scheint kompliziert und überlastet, aber es ist ziemlich wartbar und weniger schmerzhaft.

+1

Eine einzelne Person kann mehrere Freundschaften haben - Das ist eine 1-Viele-Beziehung. Wie ändert sich das über eine Zwischentabelle? Es ist immer noch ein 1-Many ... Ich bin auch neugierig, wie Sie (sagen wir) Adressen speichern - mehrere Personen können an der gleichen Adresse leben und eine einzelne Person kann mehrere Adressen haben - ohne eine Viele-Viele-Beziehung zu benutzen? Es sei denn, ich habe Ihren einleitenden Absatz missverstanden? – Basic

+0

Ja, sicher .. Zum Beispiel, wenn ein Benutzer einen anderen Freund hat, dann bedeutet das einen neuen Eintrag im Freundschaftstisch. Also hat jede Freundschaft einen Eintrag in der Freundesliste.Sie können mehrere Personen mit mehreren Adressen implementieren, ohne eine Viele-zu-Viele-Beziehung zu verwenden. Tatsächlich wird in den meisten Anwendungen nur eine Adresse als aktuelle Adresse benötigt. Sie haben also eine Benutzer- und Adresstabelle in der Benutzer-Tabellen-Viele-zu-Eins-Beziehung zur Adresse, so dass Sie mehrere Benutzer in derselben Adresse haben. Wenn Sie jedoch mehrere Benutzer in mehreren Adressen benötigen, benötigen Sie eine useraddress -Tabelle, die user_id, address_id hat, so dass Sie jetzt haben können, was Sie brauchen. – huzeyfe

+0

Einverstanden, Adresse war kein großartiges Beispiel und normalerweise ist es ein 1-Many, aber was Sie mit einer Tabelle beschrieben haben, die 'user_id' und 'address_id' enthält _ist_ eine viele-viele Beziehung, wie ich sie verstehe (und nach [ Wikipedia] (http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29)). – Basic