web-dev-qa-db-fra.com

Hibernate: vérifie quelles zones de l'entité sont modifiées

Ce que j'ai:

J'ai une entité Hibernate, qui contient de nombreux champs non transitoires, y compris des collections. L'utilisateur peut mettre à jour chaque champ séparément ou un groupe de champs à la fois.

Quel défi:

Dans le gestionnaire, je devrais vérifier quel champ de l'entité a été changé:

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

Je veux le faire pour des raisons de sécurité et de notification. Veux dire:

  1. Tous les utilisateurs ne peuvent pas modifier tous les champs
  2. Je devrais informer des utilisateurs spécifiques de manière spécifique lorsque certains champs changent.

Quel problème:

Je reçois un code très moche. En fait, je parcoure tous les champs/collections et appelle la méthode equals.

Question:

Peut-être que Hibernate fournira un moyen plus élégant de vérifier quels champs ont été modifiés? Comment?

P.S.

@victorantunes fournit une solution, mais elle me semble trop exhaustive. Peut-être des alternatives?

15
VB_

Ce que vous pouvez faire est de créer un intercepteur Hibernate qui agirait comme un déclencheur dans les événements tels que créer, modifier et mettre à jour. http://docs.jboss.org/hibernate/orm/3.3/reference/ en/html/events.html afin que tout point avant que l’entité donnée soit sur le point d’être modifié et persisté, 1.Vous pouvez vérifier si l’utilisateur a l’accès (vous pouvez obtenir nom d’utilisateur de la session ou de la base de données) pour modifier le champ particulier et, par conséquent, vous pouvez autoriser l’accès à enregistrer ou à mettre à jour. 2.Vous pouvez notifier l’autre utilisateur uniquement lorsque l’entité est modifiée.

De cette manière, vous pouvez créer un nouvel intercepteur de portée de session dans l'implémentation printanière deHibernate 4 Session session = s.withOptions (). Interceptor (new YourInterceptor (). OpenSession (); 

15
Alok

Si vous voulez pouvoir vérifier quels champs ont été modifiés, jetez un coup d'œil à Hibernate Envers, qui fonctionne comme un outil d'audit qui crée un tableau séparé contenant les modifications apportées à votre tableau de logique métier.

http://www.jboss.org/envers

J'ai commencé à l'utiliser pour certains audits internes. C'est très simple et fonctionne à merveille.

Voici un tutoriel rapide:

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

7
victorantunes

Je pense que les intercepteurs Hibernate peuvent être utilisés http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html vous pouvez comparer les anciennes et les nouvelles valeurs des champs d’entité. 

1
Bimalesh Jha