2010-12-02 12 views
2

Ich verwende Hibernate 3.6 auf zwei verschiedenen Boxen, die beide aus genau der gleichen Datenbanktabelle lesen. Die Hibernate Annotations für zwei Felder ist als solche:Hibernate lädt Postgresql bytea nicht konsistent

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

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

Nun, wenn sie mit diesen Eigenschaften auf einer Maschine (Ubuntu Linux mit Sun JDK 1.6.0_22-b04) an das Unternehmen zu laden, kann ich die 256- laden Byte verschlüsselte Schlüssel und IVs.

Dies ist jedoch nicht auf einem anderen Computer (Windows 2003 Server SP2 Enterprise Edition mit Sun JVM 1.6.0_22-b04), ich habe entweder 0 oder 511 Byte für jedes Feld geladen. Ansonsten sind die Jar-Dateien auf beiden Systemen identisch.

Die Datenbank-Engine ist PostgreSQL 9.0 und ich verwende den neuesten PostgreSQL JDBC-Treiber.

Wer hat eine Idee, was könnte schief gehen?

+0

der Postgre-Spaltentyp ist Array? – Bozho

+0

Der Postgre-Typ ist 'bytea' – malaverdiere

+0

Einige Fehlerbehebungsschritte wurden versucht: aktualisierte JVM, aktualisierte Hibernate 1.6-Bibliotheken, heruntergestuft auf Hibernate 3.3.2, geändert von infinispan zu ehcache. Ich habe auch mit den JDBC3 und JDBC4 Treibern mit den gleichen Ergebnissen versucht. Keines dieser Dinge hat etwas verändert. – malaverdiere

Antwort

2

Es stellt sich heraus, dass der JRE-lib-Ordner einen PosgreSQL 8.4-Treiber enthielt. Löschen löste dieses Problem.

+0

wahrscheinlich aufgrund der Bytea Escape-Format ändern, dann. Das Setzen von 'bytea_output' auf" escape "auf dem Server würde das auch umgehen, falls Sie das irgendwo wiederholen müssen, können Sie nicht mit der JRE herumspielen. – araqnid

+0

Guter Punkt. Wenn dieser Treiber nicht gelöscht werden kann, muss die durch den Treiber vorgenommene Entschlüsselung rückgängig gemacht werden. Großer Leistungshit. – malaverdiere

0

endgültige Lösung:

ALTER DATABASE myAmazingDbOnALinuxServer SET bytea_output = 'escape'; 

PD: Diese Variable kann die Sicherungen inkompatiblen mit Postgre unter Windows installiert ist, wird für jede Zeile der Tabellen einen COPY Fehler werfen, die eine bytea Spalte enthält.

Verwandte Themen