Dengan id tipe @GeneratedValue Anda tidak dapat mengetahui nilai itu sebelumnya (sebelum benar-benar menulisnya). Namun begitu Anda mempertahankan Bean Anda, bidang id akan diisi dalam instance bean itu dan Anda dapat memperolehnya tanpa perlu melakukan kueri tambahan untuk itu. Dengan kata lain:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();
Juga, tergantung pada bagaimana EntityManager
Anda dikonfigurasi, Anda mungkin juga perlu melakukan transaksi terlebih dahulu (secara manual) sebelum Anda bisa mendapatkan id tersebut.
Perbarui sesuai komentar
Jika Anda ingin mencegat dan melakukan sesuatu pada entitas sebelum disimpan dan/atau diperbarui, Anda dapat menggunakan JPA LifeCycle Listeners (jika Anda menggunakan JPA versi 2):Menangani peristiwa siklus hidup JPA menggunakan listener dan callback.
Pada dasarnya Anda dapat membuat validate()
metode di kacang Anda, beri anotasi dengan @PrePersist
dan @PreUpdate
dan lakukan validasi di dalamnya (jika kode kosong setel ke nilai id)
Pembaruan per komentar kedua
Ya, sejujurnya saya baru saja memikirkannya sekarang:bahwa jika id dibuat secara otomatis, itu mungkin akan diisi SETELAH acara pra-persisten, sehingga ketika kode pra-persisten Anda dieksekusi, Anda masih tidak tahu apa id itu (Anda mungkin juga memperhatikan bahwa dalam contoh yang Anda tautkan ke id TIDAK dibuat secara otomatis tetapi disetel secara manual). Yang dapat Anda lakukan dalam kasus ini adalah menambahkan bidang boolean ke entitas Anda (dianotasi dengan @Transient
jadi tidak akan bertahan) disebut isCodeEmpty
(yang salah secara default jika tidak secara khusus diinisialisasi). Kemudian di @PrePersist
metode beranotasi Anda memeriksa apakah nilai untuk bidang kode kosong dan jika demikian, setel boolean ke true. Kemudian Anda memfaktorkan ulang setId(...)
. Anda metode sedemikian rupa sehingga (selain menyetel bidang id) ia akan memeriksa boolean ini, dan jika benar, atur nilai bidang kode ke bidang id:
public class YourEntity {
@Transient
private boolean isCodeEmpty;
public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}
@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}
}
}