Si entity.getHistory() es nulo código siguiente fragmento:PostgreSQL JDBC cadena nula tomado como un bytea
(getEntityManager() devuelve resorte inyecta EntityManager, base de datos de tipo historia campo es: texto o varchar2 (2000)
Query query = getEntityManager().createNativeQuery("insert into table_name(..., history, ....) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
[...]
.setParameter(6, entity.getHistory())
[...]
query.executeUpdate();
Da extraña excepción:
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**
Consejo: Usted tendrá que volver a escribir o emitir la expresión
.problema se produjo sólo en esta configuración:
OS: CentOS suelte 5,6 (Final)
Java: 1.6.0_26
DB: PostgreSQL 8.1
controlador JDBC: postgresql-9.1-901.jdbc4
Application Server: Apache -tomcat-6.0.28
Todo funciona bien en algunas otras configuraciones o cuando el historial está vacío. La misma instrucción ejecutada desde pgAdmin funciona bien.
Supongo que el problema está en el controlador PostgreSQL JDBC, ¿hay alguna razón sensata para tratar la cadena nula como un valor bytea? Tal vez algunos cambios extraños entre Postgres 8 y 9?
Sospecho que el EntityManager ha llamado al método 'PreparedStatement.setXXX()' incorrecto para los valores NULL. También podría probar el controlador 8.1 JDBC. Por cierto, ¿sabe que 8.1 ya no es compatible? –
¿Puedes aclarar tus dos primeros párrafos? No parecen tener sentido. –
Mismo código que funciona bien con PostgreSQL 9+ (@a_horse_with_no_name El cliente debe tener 8.1 ...), Windows 7 etc. Si entity.getHistory() es "" en lugar de null, está funcionando. La misma inserción ejecutada desde pgAdmin funciona bien. – laidlook