2010-12-02 11 views
2

J'utilise Hibernate 3.6 sur deux boîtes différentes, les deux lisant exactement la même table de base de données. L'annotation Hibernate pour deux champs est en tant que tel:Hibernate pas de chargement Postgresql bytea uniformément

@Basic(fetch=FetchType.EAGER) 
@Column(name="encryptedkey",length = 256) 
protected byte[] encryptedKey; 

@Basic(fetch=FetchType.EAGER) 
@Column(name="encryptediv",length = 256) 
protected byte[] encryptedIV; 

Maintenant, lors du chargement de l'entité avec ces propriétés sur une machine (Ubuntu Linux avec Sun JDK 1.6.0_22-b04), je suis en mesure de charger le 256- octet chiffré clés et IVs.

Cependant, ce n'est pas le cas sur une autre machine (Windows 2003 serveur SP2 Enterprise Edition avec Sun JVM 1.6.0_22-b04), j'ai 0 ou 511 octets chargés pour chaque champ. Sinon, les fichiers Jar sur les deux systèmes sont identiques.

Le moteur de base de données est PostgreSQL 9.0 et j'utilise le dernier pilote JDBC de PostgreSQL.

Quelqu'un a une idée de ce qui pourrait mal se passer?

+0

le type de colonne postgre est array? – Bozho

+0

Le type dans postgre est 'bytea' – malaverdiere

+0

Quelques étapes de dépannage ont été essayées: mise à niveau de la JVM, mise à jour des librairies Hibernate 1.6, mise à niveau vers Hibernate 3.3.2, passage d'infinispan à ehcache. J'ai également essayé avec les pilotes JDBC3 et JDBC4 avec les mêmes résultats. Aucune de ces choses n'a changé quoi que ce soit. – malaverdiere

Répondre

2

Il s'avère que le dossier JRE lib contenait un pilote PosgreSQL 8.4. La suppression a résolu ce problème.

+0

probablement en raison du changement de format d'échappement bytea, alors. définir 'bytea_output' sur" escape "sur le serveur fonctionnerait aussi avec ça, au cas où vous auriez à refaire ça quelque part, vous ne pourrez pas tripoter le JRE. – araqnid

+0

Bon point. Si ce pilote ne peut pas être supprimé, l'échappement effectué par le pilote devra être annulé. Grand coup de performance. – malaverdiere

0

solution définitive:

ALTER DATABASE myAmazingDbOnALinuxServer SET bytea_output = 'escape'; 

PD: cette variable peut les sauvegardes avec Postgre installées incompatibles sous Windows, lancera une erreur de copie pour chaque ligne des tables qui contient une colonne bytea.