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:
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?
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 ();
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.
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
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é.