Hibernasi: Memetakan hubungan Pengguna-Teman di Jejaring Sosial

Sudah cukup lama saya mencoba mencari tahu masalah ini dan dari googling banyak orang mengalami masalah serupa.

Saya mencoba memodelkan Pengguna di Jejaring Sosial, menggunakan Hibernate, dan apa yang lebih mendasar dari jejaring sosial selain memetakan hubungan persahabatan? Setiap pengguna di sistem harus memiliki daftar temannya dan menurut saya ini mungkin tugas yang sangat mudah (cukup gunakan relasi ManyToMany, bukan?). Jadi saya melanjutkan untuk mencoba yang berikut ini:

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

Masalahnya sekarang adalah saya diberitahu bahwa saya salah menggunakan ManyToMany karena tidak ada perbedaan yang jelas antara teman dan berteman. Sejauh ini baik-baik saja, saya mendapatkan kesalahan, tetapi bagaimana saya bisa melakukan apa yang saya inginkan?

Ada ide? Saya telah mencapai akhir kebijaksanaan saya.


person cdecker    schedule 28.12.2008    source sumber


Jawaban (5)


Fakta tentang Banyak ke Banyak adalah memerlukan konfigurasi yang lebih banyak, karena Hibernate harus membuat tabel relasi. Coba ini:


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

Semoga berhasil =)

EDIT: Juga, berhati-hatilah dengan tipe pengambilan... Anda dapat memasukkan loop pengambilan pengguna di luar kendali dan mendapatkan semua DB.

person Juan Manuel    schedule 29.12.2008
comment
Bolehkah saya membuat satu Daftar saja dengan teman, di mana akan berteman DAN berteman? Apa gunanya harus Daftar di kelas? - person dikkini; 03.07.2014

Anotasi ManyToMany memiliki parameter mappedBy. Saya kira sesuatu seperti

@ManyToMany(mappedBy = "friends")

mungkin berhasil. Apa pun kasusnya, lihat dokumen .

Sunting:

Tampaknya hubungan banyak ke banyak harus dapat diakses dari kedua sisi. Saat ini milik Anda hanya dapat diakses dari satu ujung. Mungkin Anda harus menambahkan relasi lainnya juga:

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

Jika tidak berhasil, Anda selalu dapat memperkenalkan kelas terpisah yang mewakili hubungan antara dua pengguna, dan membiarkan setiap pengguna memiliki kumpulan instance dari kelas ini.

person Ole    schedule 28.12.2008

Poin bagus, dan sebenarnya saya mencobanya. Masalahnya adalah saya kemudian mendapat keluhan tentang atribut mappedBy yang disetel di kedua sisi hubungan, yang benar, tetapi tidak valid. Saya bertanya-tanya apakah @ManyToMany sederhana dengan beberapa kueri khusus yang cerdas untuk mengambil teman mungkin bisa menjadi solusi: ManyToMany akan menghasilkan tabel gabungan dengan user_id dan friend_id, tetapi kueri akan cocok dengan salah satu bidang, mengembalikan semua pengguna yang cocok dengan salah satu bidang tersebut. friend_id atau user_id yaitu. Ada ide?

person cdecker    schedule 28.12.2008

Tentu saja itu akan menjadi perbaikan yang bagus, namun saya belum sepenuhnya terjual. Pada dasarnya untuk mendapatkan teman saya harus menggabungkan kedua koleksi tersebut, yang mana kurang memuaskan.

Apakah sama sekali tidak ada cara untuk membuat relasi idempoten dan refleksif dalam hibernasi?

person cdecker    schedule 28.12.2008

Saya juga mengalami masalah yang sama hari ini.

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

Seharusnya baik-baik saja, saya menggunakan struktur yang serupa. Namun saya mendapat pengecualian pemuatan lambat dan ketika menyetel FetchType ke EAGER, saya mendapat keluhan tentang inisialisasi tas secara rekursif.

Bagaimana saya memperbaiki masalah saya: Dalam kueri yang Anda gunakan untuk mengambil 'pengguna', lakukan sesuatu seperti:

from User as u left join fetch u.friends

Ini akan menginisialisasi daftar teman untuk entitas tersebut. Namun berhati-hatilah karena ini tidak menginisialisasi teman mana pun dari teman tersebut. Sebenarnya itu adalah hal yang baik.

person Matthias van der Vlies    schedule 25.02.2009