2009-03-17 7 views
4

Il est bien connu qu'Oracle traite les chaînes vides comme nulles.Oracle convertit la chaîne vide en null mais JPA ne met pas à jour le cache d'entité en conséquence

Cependant, j'ai un problème à cause de ce comportement dû à la mise en cache de JPA.

D'abord je persiste en utilisant JPA (Toplink Essentials) une entité, qui a une chaîne vide en tant qu'un seul champ. Oracle convertit cette valeur en null lorsqu'elle la stocke. Cependant, lorsque je récupère l'entité, JPA semble la renvoyer du cache, où ce champ est toujours une chaîne vide. JPA ne semble pas savoir que ce qui était stocké dans la base de données était en réalité une valeur nulle, et cette incohérence cause des problèmes.

Existe-t-il un moyen de résoudre ce problème sur le niveau de configuration du JPA ou du serveur d'applications (Oracle AS)? Ce quelque chose que je ne voudrais pas corriger au niveau de l'application (mais le fera si c'est nécessaire).

Répondre

2

Nous avons migré vers EclipseLink, qui prend en charge les annotations @ReturnInsert et @ReturnUpdate. Ceux-ci aident à actualiser le champ avec la valeur qui a réellement été stockée dans la base de données.

-2

Je pense que le problème est qu'Oracle ne stocke pas la chaîne comme une valeur nulle, mais la stocke en tant que valeur "non définie" (appelons-la super-nulle). Donc, si vous essayez de sélectionner les valeurs null, vous ne récupérerez pas cet élément car il n'est pas défini et n'est pas nul. avez-vous essayé d'insérer spécifiquement null et pas une chaîne vide?

J'ai eu un projet une fois - où j'ai eu un problème similaire où la solution était de stocker spécifiquement NULL dans la base de données colonne et non String.Empty depuis qu'il a été traité comme pas défini et non comme nulle ...

+0

En fait, ces valeurs sont stockées comme nulles dans la base de données. – tputkonen

+0

okay ... avez-vous vérifié si le résultat est DBNull? puisque java fait une différence entre null et DBNull – Gambrinus

+0

Vous ne savez pas ce que vous voulez dire, mais d'abord je persiste une entité avec le champ foo (chaîne vide). Oracle stocke cela comme nul. Ensuite, je teste si foo contient une valeur nulle, sinon, essayez de le stocker dans un autre champ non nullable => exception. Je souhaite que JPA annule foo de la même façon qu'il stocke des IDs quand il persiste. – tputkonen

Questions connexes