it-swarm.dev

Hibernasi: periksa bidang entitas mana yang dimodifikasi

Apa yang saya miliki:

Saya telah Hibernate entitas, yang berisi banyak bidang non-transien, termasuk koleksi. Pengguna dapat memperbarui setiap bidang secara terpisah atau beberapa kelompok bidang sekaligus.

Apa tantangannya:

Di handler saya harus memeriksa bidang entitas yang telah diubah:

public void handle(Entity newVersion) {
  Session session = sessionFactory.openSession();
  Entity oldVersion = (Entity) session.get(Entity.class, entity.getId());
  List changedFields = compareChanges(oldVersion, newVersion);  //HOW TO CHECK WHICH FIELDS ARE CHANGED?
}

Saya ingin melakukannya untuk alasan keamanan dan pemberitahuan. Cara:

  1. Tidak semua pengguna dapat memodifikasi semua bidang
  2. Saya harus memberi tahu pengguna tertentu dengan cara tertentu pada beberapa bidang yang berubah.

Apa masalah:

Saya mendapatkan kode yang sangat jelek. Sebenarnya saya mengulangi semua bidang/koleksi dan memanggil metode equals.

Pertanyaan:

Mungkin Hibernate menyediakan cara yang lebih elegan untuk memeriksa bidang apa yang telah dimodifikasi? Bagaimana?

P.S.

@victorantunes memberikan solusi, tetapi tampaknya terlalu komprehensif untuk saya. Mungkin ada beberapa alternatif?

15
VB_

Yang dapat Anda lakukan adalah membuat Hibernate Interceptor yang akan bertindak seperti pemicu dalam acara seperti membuat, memodifikasi, dan memperbarui. http://docs.jboss.org/hibernate/orm/3.3/reference/ id/html/events.html sehingga setiap titik sebelum entitas yang diberikan akan dimodifikasi dan dipertahankan, 1. Anda dapat memeriksa apakah pengguna memiliki akses (Anda bisa mendapatkan nama pengguna dari sesi atau basis data) untuk memodifikasi bidang tertentu dan karenanya Anda dapat memberikan akses untuk menyimpan atau memperbarui. 2. Anda dapat memberi tahu pengguna lain tentang hanya ketika entitas dimodifikasi.

Dengan cara ini Anda dapat membuat Interceptor sesi-lingkup baru dalam implementasi musim semiHibernate 4 Sesi sesi = s.withOptions (). Interceptor (new YourInterceptor (). OpenSession (); 

15
Alok

Jika yang Anda inginkan adalah dapat memeriksa bidang mana yang telah dimodifikasi, mungkin perlu melihat Hibernate Envers, yang berfungsi sebagai alat audit yang membuat tabel terpisah berisi perubahan yang dibuat untuk tabel logika bisnis Anda.

http://www.jboss.org/envers

Saya mulai menggunakannya untuk beberapa audit internal dan itu sangat sederhana dan bekerja seperti pesona.

Ini tutorial singkatnya:

https://thenewcircle.com/s/post/115/easy_auditing_versioning_for_your_hibernate_entities_with_envers

7
victorantunes

Saya pikir pencegat Hibernate dapat digunakan http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html Anda dapat membandingkan nilai lama dan baru dari bidang entitas. 

1
Bimalesh Jha