Rumah  >  Artikel  >  Java  >  Hibernate: Mengapakah `saveOrUpdate` Membuang `NonUniqueObjectException` Apabila Bekerja dengan Perhubungan Banyak-ke-Banyak?

Hibernate: Mengapakah `saveOrUpdate` Membuang `NonUniqueObjectException` Apabila Bekerja dengan Perhubungan Banyak-ke-Banyak?

Susan Sarandon
Susan Sarandonasal
2024-10-28 18:53:02854semak imbas

 Hibernate: Why Does `saveOrUpdate` Throw `NonUniqueObjectException` When Working with Many-to-Many Relationships?

Hibernate: Kekeliruan dengan Pelbagai Objek Identiti Sama

Isu:

Apabila cuba untuk simpan atau kemas kini objek menggunakan kaedah saveOrUpdate Hibernate, pengecualian dilemparkan:

org.hibernate.NonUniqueObjectException: objek berbeza dengan nilai pengecam yang sama telah dikaitkan dengan sesi

Konteks:

Isu timbul apabila objek, seperti RoleBean, diperuntukkan kepada berbilang entiti, seperti UserBean dan GroupBean, dalam transaksi yang sama. Ini boleh berlaku apabila objek mempunyai hubungan banyak-ke-banyak.

Sebagai contoh, dalam senario yang diberikan, RoleBean#1 pada mulanya diberikan kepada GroupBean#1. Apabila cuba menambahkannya pada UserBean#1 dalam sesi yang sama, pengecualian ditemui.

Penyelesaian:

Punca pengecualian adalah kewujudan dua yang berbeza contoh objek RoleBean dalam sesi. Satu contoh dikaitkan secara langsung dengan UserBean, manakala satu lagi dikaitkan secara tidak langsung melalui GroupBean.

Untuk menyelesaikan isu ini, pertimbangkan pilihan berikut:

  1. Sebaliknya, gunakan gabungan daripada saveOrUpdate: Operasi gabungan mengandaikan bahawa sebarang perubahan yang dibuat pada contoh terpisah yang dikembalikan oleh Hibernate harus digabungkan kembali ke dalam pangkalan data, tanpa mengira identiti. Walau bagaimanapun, jika objek sasaran telah diubah suai di antaranya, penggabungan boleh menyebabkan kehilangan data.
  2. Pastikan bahawa contoh RoleBean yang sama digunakan sepanjang transaksi: Ini boleh dicapai dengan berhati-hati memberikan contoh yang betul kepada kedua-dua UserBean dan GroupBean. Dengan mengekalkan satu tika, anda mengelak daripada membuat objek pendua.
  3. Pertimbangkan untuk menggunakan kaedah cantum JPA: JPA menyediakan kaedah cantum yang berkelakuan serupa dengan cantuman Hibernate. Ia mengandaikan bahawa sebarang perubahan yang dibuat pada tika yang terpisah harus digabungkan kembali ke dalam pangkalan data.

Dengan melaksanakan salah satu pendekatan ini, anda boleh menyelesaikan pengecualian dan memastikan objek dengan identiti yang sama dikendalikan dengan betul dalam satu sesi Hibernate.

Atas ialah kandungan terperinci Hibernate: Mengapakah `saveOrUpdate` Membuang `NonUniqueObjectException` Apabila Bekerja dengan Perhubungan Banyak-ke-Banyak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn