Kita semua tahu perilaku default Hibernate saat menggunakan @SequenceGenerator
- ini meningkatkan urutan database nyata satu , mengalikan nilai ini dengan 50 ( allocationSize
nilai default ) - dan kemudian menggunakan nilai ini sebagai ID entitas.
Ini adalah perilaku yang salah dan bertentangan dengan spesifikasi yang mengatakan:
alokasiSize - (Opsional) Jumlah yang akan ditambahkan saat mengalokasikan nomor urut dari urutan.
Untuk memperjelas: Saya tidak peduli tentang celah antara ID yang dihasilkan.
Saya peduli dengan ID yang tidak konsisten dengan urutan database yang mendasarinya. Misalnya: aplikasi lain (misalnya menggunakan JDBC biasa) mungkin ingin memasukkan baris baru di bawah ID yang diperoleh dari urutan - tetapi semua nilai tersebut mungkin sudah digunakan oleh Hibernate! Kegilaan.
Apakah ada yang tahu solusi untuk masalah ini (tanpa pengaturan allocationSize=1
dan dengan demikian menurunkan kinerja)?
EDIT:
Untuk memperjelas. Jika catatan yang terakhir dimasukkan memiliki ID = 1
, maka nilai penggunaan HB 51, 52, 53...
untuk entitas barunya TETAPI pada saat yang sama: nilai urutan dalam database akan disetel ke 2
. Yang dapat dengan mudah menyebabkan kesalahan saat aplikasi lain menggunakan urutan itu.
Di sisi lain: spesifikasi mengatakan (dalam pemahaman saya) bahwa urutan database seharusnya diatur ke 51
dan sementara itu HB harus menggunakan nilai dari jangkauan 2, 3 ... 50
PEMBARUAN:
Seperti yang disebutkan Steve Ebersole di bawah ini: perilaku yang saya jelaskan (dan juga yang paling intuitif bagi banyak orang) dapat diaktifkan dengan pengaturan hibernate.id.new_generator_mappings=true
.
Terima kasih semuanya.
UPDATE 2:
Untuk pembaca selanjutnya, di bawah ini Anda dapat menemukan contoh yang berfungsi.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
save
kebutuhan untuk query database untuk nilai berikutnya dari urutan.
SequenceGenerator
Hibernate akan meminta database hanya jika jumlah ID yang ditentukan allocationsize
habis. Jika Anda mengatur allocationSize = 1
maka itu alasan mengapa Hibernate query DB untuk setiap sisipan. Ubah nilai ini, dan Anda selesai.
hibernate.id.new_generator_mappings
pengaturan benar-benar penting. Saya berharap ini adalah pengaturan default yang saya tidak perlu menghabiskan begitu banyak waktu untuk meneliti mengapa nomor id menjadi liar.