Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Tidak dapat mengambil id dari baris yang dimasukkan terakhir di Hibernate menggunakan Oracle

Pengecualian 'id untuk kelas ini harus ditetapkan secara manual sebelum memanggil save()' berarti Anda menggunakan strategi pembuatan pengenal 'Ditugaskan'.

ditugaskan memungkinkan aplikasi menetapkan pengenal ke objek sebelum save() dipanggil. Ini adalah strategi default jika tidak ada elemen yang ditentukan.

Jika Anda tidak menentukan strategi apa pun, hibernasi default ke 'ditugaskan'. Strategi 'ditugaskan' menyiratkan bahwa hibernate mengharapkan aplikasi menyediakan id-nya sendiri.

Jika Anda ingin menggunakan generator id urutan di Oracle, Anda dapat melakukannya dengan konfigurasi berikut -

Jika Anda menggunakan xml -

   <id name="countryId" type="java.lang.Integer">  
        <column name="Country_Id" />  
        <generator class="sequence">  
            <param name="sequence">Country_Id_Seq</param>               
        </generator>  
    </id>

Jika Anda menggunakan anotasi -

   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
   @SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq"  )
   private Integer sequence;

Dan kode Anda akan terlihat seperti ini -

Country c=new Country();

c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);

session.flush();    
System.out.println(c.getCountryId()); 

Ketika 'session.save(c)' dijalankan, hibernate membuat panggilan sql berikut ke Oracle, mengambil id dan menetapkannya di objek Country.

select Country_Id_Seq.nextVal from dual;

Masalah dengan pemicu

Karena Anda menggunakan pemicu untuk menaikkan id saat baris dimasukkan, ini akan menyebabkan masalah dengan urutan hibernasi. Hibernate menggunakan urutan untuk menghasilkan id dan database menggunakan pemicu untuk menambah id. Ini menghasilkan id yang bertambah dua kali.

Anda memiliki tiga opsi untuk menyelesaikan ini.

  1. Hapus pemicunya karena tidak perlu.

  2. Jika Anda masih memerlukan pemicu karena tabel dapat diperbarui di luar aplikasi, Anda dapat memperbarui pemicu sehingga id dihasilkan hanya jika id tidak disetel dalam pernyataan insertHIbernasi masalah dengan Oracle Trigger untuk menghasilkan id dari urutan

  3. Buat generator id khusus yang menggunakan pemicu untuk mengatur id dalam data sebelum disimpan ke db. Lihat tautan berikut - https://forum.hibernate.org/viewtopic.php?t=973262



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JIKA ADA kondisi tidak bekerja dengan PLSQL

  2. Cara mendapatkan lat dan long dari sdo_geometry di Oracle

  3. regexp_substr melompati posisi kosong

  4. Pembersihan kolom Tanggal Oracle

  5. Cara Memilih dan Memesan Berdasarkan kolom tidak dalam pernyataan Groupy By SQL - Oracle