Ok jadi ini mungkin pertanyaan sepele tapi saya kesulitan memvisualisasikan dan memahami perbedaan dan kapan harus menggunakannya. Saya juga sedikit tidak jelas tentang bagaimana konsep seperti pemetaan uni-directional dan bi-directional mempengaruhi hubungan satu-ke-banyak / banyak-ke-banyak. Saya menggunakan Hibernate sekarang sehingga penjelasan apa pun yang terkait dengan ORM akan membantu.
Sebagai contoh, katakanlah saya memiliki pengaturan berikut:
public class Person{
private Long personId;
private Set<Skill> skills;
//Getters and setters
}
public class Skill{
private Long skillId;
private String skillName;
//Getters and setters
}
Jadi dalam hal ini pemetaan seperti apa yang akan saya miliki? Jawaban untuk contoh khusus ini sangat dihargai tetapi saya juga akan sangat menyukai gambaran kapan harus menggunakan satu-ke-banyak dan banyak-ke-banyak dan kapan menggunakan tabel gabungan versus kolom bergabung dan searah versus dua arah.
sumber
Jawaban:
Satu-ke-Banyak : Satu Orang Memiliki Banyak Keahlian, Keterampilan tidak digunakan kembali di antara Orang
Many-to-Many : Satu Orang Memiliki Banyak Keterampilan, Keterampilan digunakan kembali di antara Orang
Dalam hubungan One-To-Many, satu objek adalah "orang tua" dan satu adalah "anak". Orang tua mengontrol keberadaan anak. Dalam Banyak-Untuk-Banyak, keberadaan kedua jenis tergantung pada sesuatu di luar keduanya (dalam konteks aplikasi yang lebih besar).
Subjek (domain) Anda harus menentukan apakah atau tidak hubungan itu Satu-Ke-Banyak atau Banyak-Banyak - namun, saya menemukan bahwa membuat hubungan searah atau dua arah adalah keputusan rekayasa yang memperdagangkan memori, pemrosesan, kinerja , dll.
Apa yang bisa membingungkan adalah bahwa hubungan Dua Arah Banyak ke Banyak tidak perlu simetris! Artinya, sekelompok Orang bisa menunjuk ke suatu keterampilan, tetapi keterampilan itu tidak perlu berhubungan kembali dengan orang-orang itu saja. Biasanya memang demikian, tetapi simetri semacam itu bukanlah keharusan. Ambil cinta, misalnya - itu dua arah ("I-Love", "Loves-Me"), tetapi sering asimetris ("Aku mencintainya, tapi dia tidak mencintaiku")!
Semua ini didukung dengan baik oleh Hibernate dan JPA. Hanya ingat bahwa Hibernate atau ORM lainnya tidak peduli tentang menjaga simetri ketika mengelola hubungan dua arah banyak-dua arah ... semuanya tergantung pada aplikasi.
sumber
Sepertinya semua orang menjawab
One-to-many
vsMany-to-many
.:Perbedaan antara
One-to-many
,Many-to-one
danMany-to-Many
adalah:One-to-many
vsMany-to-one
adalah masalah perspektif .Unidirectional
vsBidirectional
tidak akan memengaruhi pemetaan tetapi akan membuat perbedaan tentang cara Anda dapat mengakses data Anda.Many-to-one
satumany
sisi akan menjaga referensi darione
samping. Contoh yang baik adalah "Negara Bagian memiliki Kota". Dalam hal iniState
adalah satu sisi danCity
banyak sisi. Akan ada kolomstate_id
di tabelcities
.One-to-Many
satu sisi akan menjadi titik acuan kami. Misalnya, "Pengguna memiliki Alamat". Dalam hal ini kita mungkin memiliki tiga kolomaddress_1_id
,address_2_id
danaddress_3_id
atau mencari tabel dengan batasan unik padauser_id
danaddress_id
.Many-to-Many
anggota masing-masing pihak dapat memegang referensi ke jumlah anggota pihak lain yang sewenang-wenang. Untuk mencapai ini digunakan tabel pencarian . Contoh untuk ini adalah hubungan antara dokter dan pasien. Seorang dokter dapat memiliki banyak pasien dan sebaliknya.sumber
s.persons
, karena hanya adas.person
One-to-many
hubungan seperti yang Anda gambarkan adalahMany-to-many
hubungan karenaperson
memiliki referensi ke banyakskills
tetapiskill
tidak menyimpan referensi ke orang tertentu dan banyak yangpersons
dapat memiliki referensi yang samaskill
. DanMany-to-one
hubungan Anda sebenarnyaOne-to-many
karena setiap keterampilan hanya merujuk ke satuperson
karena seorang anak hanya memiliki satu ibu.skills
milikiperson_id
) maka Anda menyebutnya Satu-ke-banyak tetapi ketika itu satu sisi "Banyak" (pengguna dan alamat,users
milikiaddress_id
) maka Anda menyebutnya Banyak-ke-satu. Tetapi secara struktural kedua kasus itu identik dan disebut Satu-ke-banyak.1) Lingkaran adalah Entitas / POJO / Kacang
2) deg adalah singkatan untuk derajat seperti pada grafik (jumlah sisi)
PK = Kunci primer, FK = Kunci asing
Perhatikan kontradiksi antara derajat dan nama sisi. Banyak berkorespondensi dengan derajat = 1 sementara Satu berkorespondensi dengan derajat> 1.
sumber
Lihatlah artikel ini: Memetakan Hubungan Objek
sumber
this occurs when the maximum of one multiplicity is one and the other is greater than one
lolwut?Satu-ke-banyak
Hubungan tabel satu-ke-banyak terlihat sebagai berikut:
Dalam sistem database relasional, hubungan tabel satu-ke-banyak menghubungkan dua tabel berdasarkan
Foreign Key
kolom pada anak yang merujuk padaPrimary Key
baris tabel induk.Dalam diagram tabel di atas,
post_id
kolom dalampost_comment
tabel memilikiForeign Key
hubungan dengan kolompost
id tabelPrimary Key
:@ManyToOne penjelasan
Cara terbaik untuk memetakan hubungan tabel satu-ke-banyak adalah dengan menggunakan
@ManyToOne
anotasi.Dalam kasus kami, entitas anak,
PostComment
memetakanpost_id
kolom Kunci Asing menggunakan@ManyToOne
anotasi:Menggunakan
@OneToMany
anotasi JPAHanya karena Anda memiliki opsi untuk menggunakan
@OneToMany
anotasi, itu tidak berarti ini harus menjadi opsi default untuk setiap hubungan database satu-ke-banyak . Masalah dengan koleksi adalah bahwa kita hanya bisa menggunakannya ketika jumlah catatan anak agak terbatas.Cara terbaik untuk memetakan
@OneToMany
asosiasi adalah dengan mengandalkan@ManyToOne
sisi untuk menyebarkan semua perubahan status entitas:Entitas induk
Post
,, menampilkan dua metode utilitas (misalnyaaddComment
danremoveComment
) yang digunakan untuk menyinkronkan kedua sisi dari asosiasi dua arah. Anda harus selalu memberikan metode ini setiap kali Anda bekerja dengan asosiasi dua arah karena, jika tidak, Anda berisiko mengalami masalah propagasi negara yang sangat halus .@OneToMany
Asosiasi searah harus dihindari karena kurang efisien daripada menggunakan@ManyToOne
atau@OneToMany
asosiasi dua arah .Satu-ke-satu
Hubungan tabel satu-ke-satu terlihat sebagai berikut:
Dalam sistem basis data relasional, hubungan tabel satu-ke-satu menghubungkan dua tabel berdasarkan
Primary Key
kolom pada anak yang juga merupakanForeign Key
referensiPrimary Key
dari baris tabel induk.Oleh karena itu, kita dapat mengatakan bahwa tabel anak berbagi
Primary Key
dengan tabel induk.Dalam diagram tabel di atas,
id
kolom dalampost_details
tabel juga memilikiForeign Key
hubungan dengan kolompost
tabelid
Primary Key
:Menggunakan JPA
@OneToOne
dengan@MapsId
anotasiCara terbaik untuk memetakan
@OneToOne
hubungan adalah menggunakan@MapsId
. Dengan cara ini, Anda bahkan tidak memerlukan asosiasi dua arah karena Anda selalu dapat mengambilPostDetails
entitas dengan menggunakanPost
pengidentifikasi entitas.Pemetaannya terlihat seperti ini:
[kode bahasa = "java"] @Entity (name = "PostDetails") @Table (name = "post_details") kelas publik PostDetails {
} [/ kode]
Dengan cara ini,
id
properti berfungsi sebagai Primary Key dan Foreign Key. Anda akan melihat bahwa@Id
kolom tidak lagi menggunakan@GeneratedValue
anotasi karena pengenal diisi dengan pengidentifikasipost
asosiasi.Banyak ke banyak
Hubungan tabel banyak-ke-banyak terlihat sebagai berikut:
Dalam sistem basis data relasional, hubungan banyak-ke-banyak tabel menghubungkan dua tabel induk melalui tabel anak yang berisi dua
Foreign Key
kolom referensiPrimary Key
kolom dari dua tabel induk.Dalam diagram tabel di atas,
post_id
kolom dalampost_tag
tabel juga memilikiForeign Key
hubungan dengan kolompost
id tabelPrimary Key
:Dan,
tag_id
kolom dalampost_tag
tabel memilikiForeign Key
hubungan dengan kolomtag
id tabelPrimary Key
:Menggunakan
@ManyToMany
pemetaan JPAIni adalah bagaimana Anda bisa memetakan
many-to-many
hubungan tabel dengan JPA dan Hibernate:tags
asosiasi dalamPost
entitas hanya mendefinisikanPERSIST
danMERGE
kaskade jenis. Seperti dijelaskan dalam artikel ini ,REMOVE
transisi status entitas tidak masuk akal untuk@ManyToMany
asosiasi JPA karena hal itu dapat memicu penghapusan berantai yang pada akhirnya akan menghapus kedua sisi asosiasi.Post
entitas menggunakan entitas pengidentifikasi untuk kesetaraan karena tidak memiliki tombol apa saja bisnis yang unik. Seperti yang dijelaskan dalam artikel ini , Anda dapat menggunakan pengidentifikasi entitas untuk kesetaraan selama Anda memastikan bahwa itu tetap konsisten di semua transisi status entitas .Tag
entitas memiliki kunci bisnis yang unik yang ditandai dengan Hibernate spesifik@NaturalId
penjelasan. Ketika itu masalahnya, kunci bisnis yang unik adalah kandidat terbaik untuk pemeriksaan kesetaraan .mappedBy
atribut dariposts
asosiasi dalamTag
tanda entitas yang, dalam hubungan dua arah ini,Post
entitas memiliki asosiasi. Ini diperlukan karena hanya satu sisi yang dapat memiliki hubungan, dan perubahan hanya disebarkan ke database dari sisi tertentu ini.Set
lebih disukai, karena menggunakanList
dengan@ManyToMany
kurang efisien.sumber
ini mungkin akan memanggil kapal banyak-ke-banyak hubungan sebagai berikut
Anda mungkin perlu mendefinisikan joinTable + JoinColumn tetapi mungkin juga berfungsi tanpa ...
sumber
Saya akan menjelaskan seperti itu:
OneToOne - hubungan OneToOne
OneToMany - Hubungan ManyToOne
Hubungan ManyToMany - ManyToMany
sumber
Pertama-tama, baca semua cetak halus. Perhatikan bahwa pemetaan relasional NHibernate (dengan demikian, saya asumsikan juga Hibernate) memiliki korespondensi lucu dengan DB dan pemetaan objek grafik. Misalnya, hubungan satu-ke-satu sering diimplementasikan sebagai hubungan banyak-ke-satu.
Kedua, sebelum kami dapat memberi tahu Anda bagaimana Anda harus menulis peta O / R Anda, kami juga harus melihat DB Anda. Secara khusus, dapatkah Keterampilan tunggal dimiliki oleh banyak orang? Jika demikian, Anda memiliki hubungan banyak-ke-banyak; jika tidak, ini banyak-ke-satu.
Ketiga, saya lebih suka untuk tidak menerapkan hubungan banyak-ke-banyak secara langsung, tetapi sebagai gantinya memodelkan "tabel gabungan" dalam model domain Anda - yaitu, memperlakukannya sebagai entitas, seperti ini:
Lalu apakah Anda melihat apa yang Anda miliki? Anda memiliki dua hubungan satu-ke-banyak. (Dalam hal ini, Orang mungkin memiliki koleksi PersonSkills, tetapi tidak akan memiliki kumpulan Keterampilan.) Namun, beberapa akan lebih suka menggunakan hubungan banyak-ke-banyak (antara Person dan Keterampilan); ini kontroversial.
Keempat, jika Anda memiliki hubungan dua arah (misalnya, tidak hanya Orang memiliki koleksi Keterampilan, tetapi juga, Keterampilan memiliki koleksi Orang), NHibernate tidak memberlakukan bidirectionality di BL Anda untuk Anda; hanya memahami dua arah hubungan untuk tujuan kegigihan.
Kelima, banyak-ke-satu jauh lebih mudah digunakan dengan benar di NHibernate (dan saya berasumsi Hibernate) daripada satu-ke-banyak (pemetaan koleksi).
Semoga berhasil!
sumber