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

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
Susan Sarandonasal
2024-10-30 16:08:02430semak imbas

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>

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

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!

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