Jeśli entity.getHistory() jest zerowy kod następujący fragment:PostgreSQL JDBC Null String traktowane jako bytea
(getEntityManager() zwraca wiosna wstrzykuje EntityManager, baza danych typu historia pole jest: tekst lub varchar2 (2000)
Query query = getEntityManager().createNativeQuery("insert into table_name(..., history, ....) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
[...]
.setParameter(6, entity.getHistory())
[...]
query.executeUpdate();
daje dziwny wyjątek:
17/11/11 06:26:09:009 [pool-2-thread-1] WARN util.JDBCExceptionReporter:100 - SQL Error: 0, SQLState: 42804
17/11/11 06:26:09:009 [pool-2-thread-1] ERROR util.JDBCExceptionReporter:101 - ERROR: **column "history" is of type text but expression is of type bytea**
Podpowiedź: trzeba będzie przerobić lub rzucać ekspresję
.problem wystąpił tylko w tej konfiguracji:
OS: CentOS zwolnić 5,6 (Final)
Java: 1.6.0_26
DB: PostgreSQL 8.1
JDBC Kierowca: postgresql-9.1-901.jdbc4
Application Server: Apache -tomcat-6.0.28
Wszystko działa dobrze w kilku innych konfiguracjach lub gdy historia jest pustym ciągiem znaków. To samo wyrażenie wykonane z pgAdmin działa poprawnie.
Zgaduję, że problem występuje w sterowniku JDBC PostgreSQL, czy istnieje jakiś rozsądny powód, aby traktować pusty łańcuch jako wartość bajtu? Może jakieś dziwne zmiany między Postgresem 8 a 9?
Podejrzewam, że EntityManager wywołuje niewłaściwą metodę "PreparedStatement.setXXX()" dla wartości NULL. Możesz także wypróbować sterownik 8.1 JDBC. Btw: czy wiesz, że 8.1 nie jest już obsługiwany? –
Czy możesz wyjaśnić swoje pierwsze dwa akapity? Nie wydają się mieć sensu. –
Ten sam kod działa poprawnie z PostgreSQL 9+ (@a_horse_with_no_name Klient musi mieć 8.1 ...), Windows 7 itd. Jeśli entity.getHistory() ma "" wartość zamiast null, to działa. Ta sama wstawka wykonana z pgAdmin działa poprawnie. – laidlook