السبات: رسم الخرائط علاقة المستخدمين في الشبكات الاجتماعية

StackOverflow https://stackoverflow.com/questions/396391

سؤال

إنه بعض الوقت أحاول معرفة هذه المشكلة ومن جوجلينج حول الكثير من الناس لديهم مشاكل مماثلة.

أحاول طراز مستخدم في شبكة اجتماعية، باستخدام السبات، وما هو أكثر أساسية للشبكة الاجتماعية بدلا من تعيين علاقة الصداقة؟ يجب أن يكون لكل مستخدم في النظام قائمة بأصدقائه وأعتقد أن هذا قد يكون مهمة سهلة بشكل لا يصدق (فقط استخدم علاقة متعددة الجنسانية، أليس كذلك؟). لذلك ذهبت لتجربة ما يلي:

@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 خطأ من خلال عدم وجود تمييز واضح بين الصديق والصديق. جيد جدا، أحصل على الخطأ، لكن كيف يمكنني أن أفعل ما أريد؟

اي فكرة؟ لقد وصلت إلى نهاية حكمتي.

هل كانت مفيدة؟

المحلول

حقيقة وجود الكثيرين إلى الكثيرين هي أنها تحتاج إلى مزيد من التكوين قليلا، لأن حتمتها أن تولد السبات جدول العلاقة. جرب هذا:


@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;
}

آمل أن يعمل =)

تحرير: أيضا، كن حذرا للغاية مع أنواع جلب ... يمكنك إدخال مستخدم جلب حلقة خارج الرقابة والحصول على جميع DB.

نصائح أخرى

ال ManyToMany التعليق التوضيحي لديه معلمة maptby. أعتقد شيئا مثل

@ManyToMany(mappedBy = "friends")

قد تعمل. في أي حال، انظر مستندات.

يحرر:

يبدو أنه إذا كان هناك العديد من العلاقات كثيرة يمكن الوصول إليها من كلا الطرفين. حاليا لك لا يمكن الوصول إليها إلا من نهاية واحدة. ربما يجب عليك إضافة العلاقة الأخرى أيضا:

@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;
}

إذا لم يعمل ذلك، فيمكنك دائما إدخال فئة منفصلة تمثل العلاقة بين مستخدمين، ودع كل مستخدم لديه مجموعة من مثيلات هذه الفئة.

نقطة جيدة، وفي الواقع حاولت ذلك. المشكلة هي أنني حصلت بعد ذلك على شكوى حول سمة Maptby التي يتم تعيينها على جانبي العلاقة، وهذا صحيح، ولكن غير صالح. كنت أتساءل أتساءل بسيط @ManyToMany مع بعض الاستعلام المخصص الذكي لجلب قد يكون الأصدقاء حلا: ManyToMany سوف تولد طاولة الانضمام مع user_id و friend_id, لكن الاستعلام سوف يتطابق مع أي من الحقول، وإرجاع جميع المستخدمين حيث يطابق ذلك إما friend_id أو ال user_id إنه. أيه أفكار؟

سيكون ذلك بالطبع إصلاحا جيدا، لكنني لم أبيع بالكامل بعد. أساسا للحصول على الأصدقاء، يجب أن دمج المجموعتين، وهو أمر غير مرضي للغاية.

هل لا توجد طريقة على الإطلاق لخلق علاقة idempotent، علاقة انعكاسية في السبات؟

كان لدي نفس المشكلة اليوم أيضا.

@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
}

يجب أن يكون موافق، لقد استخدمت بنية مماثلة. ومع ذلك، فقد حصلت على استثناءات تحميل كسول وعند تحديد fetchtype حريصة، حصلت على شكاوى حول التهيمة العودية للأكياس.

كيف قمت بإصلاح مشكلتي: في الاستعلام الذي تستخدمه لجلب "المستخدم"، افعل شيئا مثل:

from User as u left join fetch u.friends

هذا سوف تهيئة قائمة الأصدقاء لهذا الكيان. يتم تحذيرها رغم أنه لا يتهال أي أصدقاء من هؤلاء الأصدقاء. هذا شيء جيد في الواقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top