Hibernate: vérification sale et mise à jour uniquement des atsortingbuts sales?

Dans les “bons vieux jours JDBC”, j’ai écrit beaucoup de code SQL qui ne faisait que des mises à jour très ciblées des “atsortingbuts / membres” réellement modifiés:

Par exemple, considérons un object avec les membres suivants:

public Ssortingng name; public Ssortingng address; public Date date; 

Si seule la date été modifiée dans une méthode métier, je n’émettrais qu’une UPDATE SQL pour le membre date .

Il semble cependant (c’est mon “impression” d’Hibernate) que, lorsque vous utilisez un mappage Hibernate standard (mappage de la classe complète), même les mises à jour d’un seul membre entraînent une mise à jour complète de l’object dans les instructions SQL générées par Hibernate.

Mes questions sont:

  1. Cette observation est-elle correcte, qu’Hibernate ne vérifie pas de manière intelligente (dans une classe entièrement mappée), quel (s) membre (s) a (ont) été modifié (s) et n’émet que des mises à jour pour les membres modifiés spécifiés; tous les membres mappés (d’une classe), même s’ils n’ont pas été modifiés (au cas où l’object est sale parce qu’un membre est sale …)

  2. Que puis-je faire pour qu’Hibernate ne mette à jour que les membres qui ont été modifiés? Je cherche une solution pour qu’Hibernate ne mette à jour que le membre qui a réellement changé.

(Je sais que Hibernate fait un peu de travail sur la vérification en profondeur, mais pour autant que je sache, cette vérification en profondeur est uniquement pertinente pour déterminer si l’object dans son ensemble est encrassé, et non quel membre individuel est encrassé.)

En fait, vous pouvez spécifier les options dynamic-update et dynamic-insert dans un mappage de classe. C’est juste que. Plus d’infos ici .

Hibernate vient de mettre à jour ce que vous voulez vraiment

 public class Person { private Integer id; public Ssortingng name; public Ssortingng address; public Date date; // getter's and setter's } 

Et vous faites quelque chose comme

 Person person = (Person) sessionFactory.openSession().get(Person.class, personId); person.setName("jean"); 

Hibernate est suffisamment intelligent pour savoir que la propriété nommée a été modifiée. Bien que vous puissiez voir votre journal comme suit

 UPDATE PERSON (NAME, ADDRESS, DATE) VALUES (?, ?, ?); 

Etant donné qu’Hibernate met en cache chaque requête SQL (INSERT, UPDATE, SELECT) pour chaque entité, il ne fait que mettre à jour ce que vous voulez vraiment.

Vous pouvez optimiser énormément les vérifications en utilisant des interfaces telles que CustomEntityDirtinessStrategy ou Interceptor. Voir l’exemple de travail sur http://prismoskills.appspot.com/lessons/Hibernate/Chapter_20_-_Dirty_checking.jsp

Je pense que la mise à jour dynamic est utile si vous avez une charge de firebase database importante et un ou plusieurs index à recréer lors d’une mise à jour complète (où toutes les colonnes sont mises à jour, y compris celles avec des valeurs inchangées).

Certains SGBD reconnaîtront peut-être si UPDATE définit une valeur existante pour ne pas mettre à jour un index incluant cette colonne. Mais beaucoup semblent être trop “stupides” pour le reconnaître (ou ne le vérifient pas pour des raisons de performances).

La charge côté client pour la création de requêtes SQL ne pose pas de problème pour la plupart des applications clientes de firebase database. L’interprétation de SQL dans la firebase database devrait prendre moins de temps que la recréation d’un index volumineux.

Corrigez-moi si j’ai tort, s’il-vous plait!