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

Bagaimana cara mengetahui id sebelum menyimpan objek di jpa

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;
 }

}


}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Performa SUBSTR di CLOB

  2. Perluas Kontrol Grid EM ke Node Baru

  3. Oracle 11g:Default ke nilai statis saat kueri tidak menghasilkan apa-apa

  4. Database Oracle tergantung tanpa batas dalam kueri UPDATE

  5. Fungsi agregat selama interval waktu tertentu