Saya memiliki dua Objek pengguna dan ketika saya mencoba untuk menyimpan objek menggunakan
session.save(userObj);
Saya mendapatkan kesalahan berikut:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]
Saya membuat sesi menggunakan
BaseHibernateDAO dao = new BaseHibernateDAO();
rtsession = dao.getSession(userData.getRegion(),
BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);
rttrans = rtsession.beginTransaction();
rttrans.begin();
rtsession.save(userObj1);
rtsession.save(userObj2);
rtsession.flush();
rttrans.commit();
rtsession.close(); // in finally block
Saya juga mencoba melakukan session.clear()
sebelum menabung, masih belum berhasil.
Ini untuk pertama kalinya saya mendapatkan objek sesi ketika permintaan pengguna datang, jadi saya mengerti mengapa mengatakan objek itu hadir dalam sesi.
Ada saran?
Jawaban:
Saya telah mengalami kesalahan ini berkali-kali dan cukup sulit untuk dilacak ...
Pada dasarnya, apa yang dikatakan hibernasi adalah Anda memiliki dua objek yang memiliki pengenal yang sama (kunci utama yang sama) tetapi keduanya bukan objek yang sama.
Saya sarankan Anda memecah kode Anda, yaitu mengomentari bit sampai kesalahan hilang dan kemudian mengembalikan kode sampai kembali dan Anda harus menemukan kesalahan.
Ini paling sering terjadi melalui penyimpanan bertingkat di mana ada penyimpanan bertingkat antara objek A dan B, tetapi objek B telah dikaitkan dengan sesi tetapi tidak pada contoh B yang sama seperti yang ada di A.
Generator kunci utama apa yang Anda gunakan?
Alasan saya bertanya adalah kesalahan ini terkait dengan bagaimana Anda memberi tahu hibernate untuk memastikan status persisten suatu objek (yaitu apakah suatu objek persisten atau tidak). Kesalahan bisa terjadi karena hibernasi mencoba mempertahankan objek yang sudah persisten. Faktanya, jika Anda menggunakan save hibernate akan mencoba dan mempertahankan objek itu, dan mungkin sudah ada objek dengan kunci utama yang sama yang terkait dengan sesi.
Contoh
Dengan asumsi Anda memiliki objek kelas hibernasi untuk tabel dengan 10 baris berdasarkan kombinasi kunci primer (kolom 1 dan kolom 2). Sekarang, Anda telah menghapus 5 baris dari tabel di beberapa titik waktu. Sekarang, jika Anda mencoba menambahkan 10 baris yang sama lagi, saat hibernate mencoba mempertahankan objek dalam database, 5 baris yang telah dihapus akan ditambahkan tanpa kesalahan. Sekarang 5 baris tersisa yang sudah ada, akan membuang pengecualian ini.
Jadi pendekatan yang mudah akan memeriksa apakah Anda telah memperbarui / menghapus nilai apa pun dalam tabel yang merupakan bagian dari sesuatu dan kemudian Anda mencoba memasukkan objek yang sama lagi
sumber
Ini hanya satu titik di mana hibernasi membuat lebih banyak masalah daripada menyelesaikannya. Dalam kasus saya, ada banyak objek dengan pengenal 0 yang sama, karena mereka baru dan belum memilikinya. DB menghasilkannya. Di suatu tempat saya telah membaca bahwa 0 sinyal Id tidak diatur. Cara intuitif untuk menahannya adalah mengulanginya dan mengucapkan hibernasi untuk menyimpan objek. Tetapi Anda tidak dapat melakukan itu - "Tentu saja Anda harus tahu bahwa hibernasi berfungsi ini dan itu, oleh karena itu Anda harus .." Jadi sekarang saya dapat mencoba mengubah Id menjadi Panjang daripada panjang dan melihat apakah kemudian berfungsi. Pada akhirnya, akan lebih mudah melakukannya dengan mapper sederhana sendiri, karena hibernasi hanyalah beban tambahan yang tidak transparan. Contoh lain: Mencoba membaca parameter dari satu database dan menyimpannya di database lain memaksa Anda untuk melakukan hampir semua pekerjaan secara manual.
sumber
USe
session.evict(object);
Fungsievict()
metode digunakan untuk menghapus instance dari cache sesi. Jadi untuk pertama kalinya menyimpan objek, simpan objek dengan memanggilsession.save(object)
metode sebelum mengeluarkan objek dari cache. Dengan cara yang sama, perbarui objek dengan memanggilsession.saveOrUpdate(object)
atausession.update(object)
sebelum memanggil evict ().sumber
Ini bisa terjadi ketika Anda telah menggunakan objek sesi yang sama untuk membaca & menulis. Bagaimana? Katakanlah Anda telah membuat satu sesi. Anda membaca catatan dari tabel karyawan dengan kunci utama Emp_id = 101 Sekarang Anda telah mengubah catatan di Java. Dan Anda akan menyimpan catatan Karyawan di database. kami belum menutup sesi di mana pun di sini. Sebagai objek yang dibaca juga bertahan dalam sesi tersebut. Ini bertentangan dengan objek yang ingin kita tulis. Karenanya kesalahan ini datang.
sumber
Seperti seseorang yang sudah ditunjukkan di atas, saya mengalami masalah ini ketika saya memiliki
cascade=all
kedua ujungone-to-many
hubungan, jadi mari kita asumsikan A -> B (satu-ke-banyak dari A dan banyak-ke-satu dari B) dan memperbarui contoh dari B di A dan kemudian memanggil saveOrUpdate (A), itu menghasilkan permintaan penyimpanan melingkar yaitu penyimpanan pemicu A, simpan B yang memicu penyimpanan A ... dan dalam contoh ketiga ketika entitas (dari A) dicoba untuk ditambahkan ke sessionPersistenceContext pengecualian duplikatObject dilemparkan.Saya bisa mengatasinya dengan menghapus kaskade dari satu ujung.
sumber
Anda dapat menggunakan
session.merge(obj)
, jika Anda melakukan penyimpanan dengan sesi yang berbeda dengan objek persisten pengenal yang sama.Berhasil, saya memiliki masalah yang sama sebelumnya.
sumber
Saya juga mengalami masalah ini dan kesulitan menemukan kesalahannya.
Masalah yang saya miliki adalah sebagai berikut:
Objek telah dibaca oleh Dao dengan sesi hibernasi yang berbeda.
Untuk menghindari pengecualian ini, cukup baca ulang objek dengan dao yang akan menyimpan / memperbarui objek ini nanti.
begitu:
Berharap bisa menghemat banyak waktu!
sumber
Saya mengalami masalah ini dengan:
Saya menyelesaikannya dengan membersihkan hasil setelah menghapus, dan membersihkan cache sebelum menyimpan objek baru
sumber
Masalah ini terjadi ketika kita memperbarui objek sesi yang sama, yang telah kita gunakan untuk mengambil objek dari database.
Anda dapat menggunakan metode gabungan hibernasi daripada metode pembaruan.
misalnya Pertama gunakan session.get () dan kemudian Anda bisa menggunakan session.merge (object). Cara ini tidak akan menimbulkan masalah. Kita juga bisa menggunakan metode merge () untuk memperbarui objek dalam database.
sumber
Dapatkan objek di dalam sesi, berikut contohnya:
sumber
Apakah pemetaan Id Anda benar? Jika database bertanggung jawab untuk membuat Id melalui pengenal, Anda perlu memetakan objek pengguna Anda ke itu ..
sumber
Saya mengalami masalah ini saat menghapus objek, baik evict maupun clear tidak membantu.
sumber
sebelum posisi di mana objek berulang dimulai, Anda harus menutup sesi dan kemudian Anda harus memulai sesi baru
jadi dengan cara ini dalam satu sesi tidak lebih dari satu entitas yang memiliki identifier yang sama.
sumber
Terlambat ke pesta, tetapi mungkin membantu untuk pengguna yang akan datang -
Saya mendapat masalah ini ketika saya memilih catatan menggunakan
getsession()
dan sekali lagi memperbarui catatan lain dengan pengenal yang sama menggunakan sesi yang sama menyebabkan masalah. Kode ditambahkan di bawah.Ini tidak boleh dilakukan. Solusi adalah sesi penggusuran sebelum memperbarui atau mengubah logika bisnis.
sumber
Periksa apakah Anda lupa meletakkan @GenerateValue untuk kolom @Id. Saya memiliki masalah yang sama dengan banyak ke banyak hubungan antara Film dan Genre. Program melemparkan Kesalahan Hibernate: org.hibernate.NonUniqueObjectException: objek berbeda dengan nilai pengenal yang sama sudah terkait dengan kesalahan sesi. Saya kemudian mengetahui bahwa saya hanya perlu memastikan Anda memiliki @GenerateValue ke metode get GenreId.
sumber
cukup periksa id apakah dibutuhkan null atau 0 like
di tambah atau perbarui di mana konten diatur dari formulir ke Pojo
sumber
Saya baru mengenal NHibernate, dan masalah saya adalah saya menggunakan sesi yang berbeda untuk menanyakan objek saya daripada yang saya lakukan untuk menyimpannya. Jadi sesi penyimpanan tidak tahu tentang objeknya.
Tampaknya jelas, tetapi dari membaca jawaban sebelumnya saya mencari 2 objek, bukan 2 sesi.
sumber
@GeneratedValue (strategy = GenerationType.IDENTITY), menambahkan anotasi ini ke properti kunci utama di kacang entitas Anda harus menyelesaikan masalah ini.
sumber
Saya menyelesaikan masalah ini.
Sebenarnya ini terjadi karena kita lupa implementasi Jenis Generator properti PK di kelas kacang. Jadi buatlah semua jenis seperti
ketika kita mempertahankan objek kacang, setiap objek memperoleh ID yang sama, jadi objek pertama disimpan, ketika objek lain akan bertahan maka HIB FW melalui jenis
Exception: org.hibernate.NonUniqueObjectException:
objek yang berbeda dengan nilai pengenal yang sama sudah dikaitkan dengan sesi.sumber
Masalahnya terjadi karena dalam sesi hibernasi yang sama Anda mencoba menyimpan dua objek dengan pengenal yang sama. Ada dua solusi: -
Ini terjadi karena Anda belum mengonfigurasi file mapping.xml dengan benar untuk bidang id seperti di bawah ini: -
Overload metode getsession untuk menerima Parameter seperti isSessionClear, dan hapus sesi sebelum mengembalikan sesi saat ini seperti di bawah
Ini akan menyebabkan objek sesi yang ada dihapus dan bahkan jika hibernasi tidak menghasilkan pengenal unik, dengan asumsi Anda telah mengkonfigurasi database Anda dengan benar untuk kunci utama menggunakan sesuatu seperti Auto_Increment, itu akan bekerja untuk Anda.
sumber
Saya memiliki masalah serupa. Dalam kasus saya, saya lupa mengatur
increment_by
nilai dalam database agar sama seperti yang digunakan olehcache_size
danallocationSize
. (Panah menunjuk ke atribut yang disebutkan)SQL:
Jawa:
sumber
Selain dari apa yang dikatakan wbdarby , itu bahkan bisa terjadi ketika sebuah objek diambil dengan memberikan pengidentifikasi objek ke HQL. Dalam kasus mencoba untuk mengubah bidang objek dan menyimpannya kembali ke dalam DB (modifikasi dapat dimasukkan, dihapus atau diperbarui) pada sesi yang sama , kesalahan ini akan muncul. Coba bersihkan sesi hibernasi sebelum menyimpan objek yang dimodifikasi atau buat sesi baru.
Harap saya membantu ;-)
sumber
Saya memiliki kesalahan yang sama saya mengganti Set saya dengan yang baru dari Jackson.
Untuk mengatasi ini saya menyimpan set yang ada, saya menghapus dari set lama elemen yang tidak diketahui ke dalam daftar baru
retainAll
. Lalu saya menambahkan yang baru denganaddAll
.Tidak perlu memiliki Sesi dan memanipulasinya.
sumber
Coba ini. Di bawah ini berhasil untuk saya!
Di dalam
hbm.xml
fileKita perlu mengatur
dynamic-update
atribut tag kelas ketrue
:Setel atribut kelas dari tag generator di bawah kolom unik ke
identity
:Catatan: Tetapkan kolom unik ke
identity
daripadaassigned
.sumber
Hal lain yang berhasil bagi saya adalah membuat variabel instance Long menggantikan long
Saya memiliki id panjang variabel kunci utama saya; mengubahnya menjadi Long id; bekerja
Semua yang terbaik
sumber
Anda selalu bisa melakukan sesi flush. Flush akan menyinkronkan status semua objek Anda dalam sesi (tolong, seseorang mengoreksi saya jika saya salah), dan mungkin itu akan menyelesaikan masalah Anda dalam beberapa kasus.
Menerapkan persamaan dan kode hash Anda sendiri dapat membantu Anda juga.
sumber
Anda dapat memeriksa Pengaturan Kaskade Anda. Pengaturan Cascade pada model Anda dapat menyebabkan hal ini. Saya menghapus Pengaturan Kaskade (Pada dasarnya tidak mengizinkan Sisipan / Pembaruan Kaskade) dan ini memecahkan masalah saya
sumber
Saya menemukan kesalahan ini juga. Apa yang berhasil bagi saya adalah memastikan bahwa kunci utama (yang dihasilkan secara otomatis) bukan PDT (yaitu panjang, int, dll.), Tetapi sebuah objek (yaitu Panjang, Integer, dll.)
Saat Anda membuat objek untuk menyimpannya, pastikan Anda mengirimkan null dan bukan 0.
sumber
Apakah ini membantu?
sumber
Saya telah memecahkan masalah serupa seperti itu:
sumber