Quelqu'un at-il entendu parler de cette erreur avant:Hibernate + Oracle + Clob: Contenu des attributs se commutée
J'ai une application Java 5, qui utilise Hibernate 3.3.2 pour accéder à une base de données Oracle 10g, le pilote JDBC est la version du pilote de lumière Oracle 10.2.0.4.0 (la version la plus récente, je pense). L'accès à la base de données se fait lors d'une transaction gérée via les outils AOP du printemps. Il y a une table de base de données mappée à une entité Java, le mappage est effectué via des annotations. Il y a deux attributs dans cette entité qui sont CLOB dans la base de données. Ils sont annotés selon JPA avec "Lob" et sont Java Strings. Everthing fonctionne correctement sauf si les deux attributs ont des valeurs de plus de 4000 caractères: Après la validation, les valeurs sont activées dans la base de données, c'est-à-dire que l'attribut A contient la valeur de l'attribut B et vice versa.
Ce n'est pas une blague!
Le débogueur Eclipse me dit que l'entité Java a les valeurs correctes jusqu'à la fermeture de la transaction (je n'ai pas débogué dans la gestion des transactions de printemps). Cette erreur ne se produit pas si les deux Clobs sont annotés avec l'annotation Hibernate 'Type (type = "clob")' (auquel cas ils doivent être du type java.sql.Clob et non String, bien sûr).
Oui, merci, qui est censé corriger les erreurs avec plus de 32 Ko dans un CLOB-Attribute, je l'ai fait essayer en vain. Il y a plusieurs questions ici sur stackoverflow et ailleurs sur les problèmes avec un seul attribut CLOB et un contenu supérieur à 4000 caractères ou plus. J'espère que je les ai tous trouvés :-) Notez que mon problème se produit seulement quand au moins deux attributs ont plus de 4000 caractères. –
@Tim TBH, c'était plus un tir dans l'obscurité.En fait, votre cas est vraiment étrange (et je me demande * qui * échange les valeurs) et sent comme un méchant bug quelque part. Ajoutant cette question à mon préféré pour suivre cette histoire. –
Je suppose que a) les valeurs CLOB nécessitent un traitement spécial si elles contiennent plus de 4000 caractères, et b) Hibernate ou le pilote Oracle JDBC a une erreur qui change les valeurs s'il y en a plusieurs qui ont besoin de cette gestion supplémentaire. Mais je ne peux pas me permettre le temps de déboguer les deux, et je n'ai pas trouvé de bogue similaire dans la DB d'Hibernate. (Je ne peux pas simplement mettre à jour Hibernate, parce que le logiciel est utilisé en production et changer toute la distribution d'Hibernate nécessiterait un test complet de l'ensemble du logiciel). –