10
votes

Comment savoir ce qui fait un hibernate persisté objet de sale?

Un objet que j'ai mappé avec hibernate a un comportement étrange. Afin de savoir pourquoi l'objet se comporte étrangement, j'ai besoin de savoir ce qui rend cet objet sale. Quelqu'un peut-il vous aider et me donner un indice?

L'objet est une classe Java dans un contexte Java / Spring. Je préférerais donc une réponse ciblant la plate-forme Java.

EDIT: J'aimerais avoir accès à l'état Hibernate Sale et à la manière dont il change sur un objet attaché à une session. Je ne sais pas comment un morceau de code aiderait.

Quant au problème réel: dans une transaction gérée par un transacteur de printemps, je fais des requêtes (lire) sur des objets et sans faire une économie explicite sur ces objets, ils sont enregistrés par le transactionManager car Hibernate pense que certaines de ces (et pas tous) sont sales. Maintenant, j'ai besoin de savoir pourquoi Hibernate pense que ces objets sont sales.


1 commentaires

Une description supplémentaire de l'erreur / problème exact plus que certains codes auraient peut-être une meilleure chance pour une réponse


3 Réponses :


0
votes

En supposant que l'état de l'objet ne puisse pas être consulté directement (par exemple, aucun champ Public ou package protégé) et n'est pas traitée par la réflexion, vous pouvez mettre un point d'arrêt au début de toutes les méthodes de l'objet et exécuter le scénario. qui rend l'objet sale dans le débogueur.


0 commentaires

1
votes
  1. Créez un boîtier de test ou similaire, vous pouvez donc reproduire le problème avec un seul clic.
  2. Activer la journalisation pour org.hibernate Vérifiez la journalisation de la chaîne "sale" (en réalité, vous n'avez pas besoin de tous les org.hibernate, mais je ne connais pas l'enregistreur exact.
  3. trouver dans des endroits dans le programme, l'un où l'entité n'est pas sale, l'une où elle est sale. Trouvez le milieu du code entre les deux points et mettez une instruction de journalisation là-bas, pour la journalisation de la valeur ISDIRATTY. Continuez avec la stratégie jusqu'à ce que vous ayez réduit le code sur une seule ligne.
  4. Découvrez le code hibernate. Trouvez le code qui fait le chèque sale. Utilisez un débogueur pour passer à travers elle.

0 commentaires

7
votes

J'utiliserais un intercepteur. La méthode OnflushDirty obtient l'état actuel et précédent afin que vous puissiez les comparer. Implémentez l'interception de l'intercepteur et étendez VideInterceptor, primordial OnflushDirty. Ajoutez ensuite une instance de cette classe à l'aide de Configuration.setterceptor (le ressort peut vous obliger à le faire différemment). Vous pouvez également ajouter un intercepteur à la session plutôt qu'au démarrage.

Voici la documentation sur les intercepteurs.


1 commentaires

Cela ne vous dira pas Qu'est-ce que a fait un objet sale que quels champs sont sales. Le rinçage se produit après que l'objet change d'état, souvent à la fin de la transaction.