Cuando Hibernate ataca a Postgres…
07 feb 2007
Quizas este post te ayude si estas buscando una solucion para alguna de las siguientes cuestiones:
- Pasarle comillas a la BBDD atraves de Hibernate
- Usar palabras reservadas del gestor de BBDD como nombre de columna o tabla en JPA.
- Tienes una org.postgresql.util.PSQLException
- Tienes una excepcion: column notation applied to type name, which is not a composite type
Recientemente jugando con JPA contra Postgres nos hemos encontrado con un problema de los que le pueden volver loco a uno. La excepcion que teniamos era:
org.postgresql.util.PSQLException: ERROR: .user_id column notation applied to type name, which is not a composite type
Es el tipo de mensaje de error que despista y te puede hacer dar vueltas durante horas (o dias) buscando el problema donde no es.
Nosotros estabamos convencidos de que habia algo erroneo en nuestras annotations de las columnas
@Column(name="user_id")
Pero lo que ya nos hacia tirarnos de los pelos era que nos pasaba lo mismo ya hiciesemos la query consultando user_id o email.
org.postgresql.util.PSQLException: ERROR: .email column notation applied to type name, which is not a composite type
En general nos ocurria con cualesquiera columnas de nuestra tabla user.
Al final dimos con lo que estaba ocurriendo… el problema estaba en la annotation
@Table(name="user")
Os vais a reir… Resulta que user es una palabra reservada de Postgres, como tambien lo es id y algunas otras. Asi que si llamamos user a nuestra tabla, en la annotation necesitamos usar comillas para que el motor de BBDD no se haga un lio.
Y la forma de pasarle a Hibernate las comillas viene explicada aqui:
http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-quotedidentifiers
O sea, que usando la tilde invertida -`- Hibernate nos la traduce a las comillas adecuadas del dialecto adecuado.
Basicamente, nuestro problema se arreglo haciendo:
@Table(name="`user`")
Gracias!!!!!!
Si gracias, estoy empezando a usar Postgre y aun no me topaba con ese problema pero lo tengo exactamente asi.
Muchas gracias, mi problema era parecido, el fallo venia de la select que hacia hibernate y que postgres no entendia,
Ejemplo
Select campo1,campo3 from tabla
en ves de
Select campo1,campo3 from “tabla”