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.
-
Hapus pemicunya karena tidak perlu.
-
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
-
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