Rumah > Java > javaTutorial > teks badan

Mengapa Hibernate membuang \'objek berbeza dengan nilai pengecam yang sama telah dikaitkan dengan pengecualian sesi\' apabila menyimpan kacang pengguna dengan koleksi bersarang dan bagaimana

Susan Sarandon
Lepaskan: 2024-10-30 16:08:02
asal
302 orang telah melayarinya

Why does Hibernate throw the

Hibernate: Pengendalian Pengecualian dengan Pengecam Objek Pendua

Mesej ralat "Hibernate: objek berbeza dengan nilai pengecam yang sama telah dikaitkan dengan session" berlaku apabila Hibernate menemui objek dengan pengecam sedia ada yang telah dikaitkan dengan sesi semasa. Ini boleh timbul apabila cuba menyimpan atau mengemas kini objek yang sudah ada dalam sesi, mengakibatkan konflik.

Dalam kod yang disediakan:

<code class="java">public E save(E e) {
    Session session = null;
    try {
        session = sessionFactory.openSession();
        log.debug("session="+session.hashCode()+" save "+e);
        session.saveOrUpdate(e);  //here throws exception 
        session.flush();
    }
    catch (Exception e1) {
        log.err("Cannot open hibernate session "+ e1.getMessage()+" cause : "+e1.getCause());
        e1.printStackTrace();
    }
    finally { if ( session != null ) session.close(); session = null;}
    return e ;
}</code>
Salin selepas log masuk

Pengecualian dilemparkan apabila mencuba untuk saveOrUpdate kacang pengguna. Punca masalah nampaknya ialah kacang pengguna mengandungi senarai kacang kumpulan, yang seterusnya mempunyai senarai peranan. Apabila menyimpan kacang pengguna, Hibernate cuba menyimpan peranan dua kali: sekali sebagai sebahagian daripada kacang kumpulan dan sekali lagi sebagai sebahagian daripada senarai peranan kacang pengguna.

userbean#1
|---|-----------***userbean.groups
|     |     groupbean#1
|     |         groupbean.roles
|     |             rolebean#1  # save relebean#1 the first time
|     |             ---done rolebean#1
|     |         ------done all rolebeans of group.roles
|     |     ---done groupbean#1
|     |-----------done all groupbeans of userbean.groups
|---|-----------***userbean.roles
     |      rolebean#1          # save rolebean#1 the second time, and throws exception here!
     |      ----done rolebean#1
     |      .....
     |-----------done all rolebeans of userbean.roles
Salin selepas log masuk

Untuk menyelesaikan isu ini, pertimbangkan pendekatan berikut :

  • Gunakan session.merge() bukannya session.saveOrUpdate()**: Ini akan memberitahu Hibernate bahawa objek itu sudah diurus dan sepatutnya dikemas kini jika perlu, dan bukannya menyimpannya semula.
  • Pastikan objek dilampirkan pada sesi sebelum menyimpan atau mengemas kini: Ini boleh dicapai menggunakan session.load() atau session .get() untuk mendapatkan semula objek daripada pangkalan data.

Atas ialah kandungan terperinci Mengapa Hibernate membuang \'objek berbeza dengan nilai pengecam yang sama telah dikaitkan dengan pengecualian sesi\' apabila menyimpan kacang pengguna dengan koleksi bersarang dan bagaimana. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!