mardi 8 avril 2008

Problème de synchronisation avec hibernate

Lors de l'appel de saveOrUpdate() or update() j'ai une NonUniqueObjectException.

La session utilise un cache entre la persistance et l'objet instance, ce cache est unique (Il se manifeste par les proxy cglig). L'appel de saveOrUpdate determine premièrement si cet objet existe en base, si oui, il construit son proxy CGLIB, ainsi hibernate sait si cet objet existe ou non en base de données. La comparaison de l'objet proxié et de l'objet que nous tentons d'insérer (Non proxié) provoque une incohérence et retourne l'erreur ci dessus.

L'utilisation de la fonction saveOrUpdate() ne sert pas comme on le croit d'abord, à permettre de procéder à des insert ou des update en aveugle.

La solution de ce problème est soit de connaitre l'état de l'objet avant de faire l'insertion en base. (Ce qui diminue notablement le charme de la fonction saveOrUpdate) soit d'utiliser la fonction merge, qui permet de cloné un objet sur son proxy.

marge prend en argument un objet non proxié et retourne un objet proxié clone exact de l'objet passé en argument.

Aucun commentaire: