2012-02-06 15 views
11

Tengo una aplicación de primavera que utiliza JPA (Hibernate) inicialmente creado con Spring Roo. Necesito almacenar cadenas de longitud arbitraria, por lo que por esa razón he anotada el campo con @Lob:cadenas de tienda de longitud arbitraria en Postgresql

public class MyEntity{ 

    @NotNull 
    @Size(min = 2) 
    @Lob 
    private String message; 

    ... 
} 

La aplicación funciona bien en localhost pero he desplegado a un servidor externo y se un problema con la codificación ha aparecido. Por ese motivo, me gustaría verificar si los datos almacenados en la base de datos PostgreSQL están correctos o no. La aplicación crea/actualiza las tablas automáticamente. Y para ese campo (mensaje) se ha creado una columna de tipo:

texto NO NULO

El problema es que después de almacenar datos si hojeo la mesa o simplemente hacer un SELECT de esa columna No puedo ver el texto, pero los números. Esos números parecen ser identificadores de "algún lugar" donde se almacena esa información.

¿Alguien me puede decir exactamente qué son estos identificadores y si hay alguna forma de poder ver los datos almacenados en una columna @Lob de una pgAdmin o una cláusula select?

¿Hay alguna forma mejor de almacenar Cadenas de longitud arbitraria en JPA?

Gracias.

+0

¿Ha intentado navegar por la base de datos con 'pgAdmin'? ¿Puedes ver el texto en las columnas? (Esto debería funcionar) – beerbajay

+0

@beerbajay Sí, lo he intentado, pero si navego en pgAdmin o simplemente hago un SELECT obtengo lo mismo: números (identificadores) en lugar del texto correcto. – Javi

+0

El 'text NOT NULL' parece correcto, debería poder ver el texto. Así que esto realmente no parece un problema de primavera/hibernación/JPA, pero una base de datos es un problema mal configurado. – beerbajay

Respuesta

18

recomendaría evitando la anotación '@Lob' y utilizar ColumnDefinition así:

@Column(columnDefinition="TEXT") 

o

@Column(columnDefinition="LONGTEXT") 

ver si eso ayuda a la visualización de los datos durante la navegación por la base de datos en sí.

+0

gracias por el truco. Ha resuelto el problema de examinar los datos directamente en la aplicación y también el problema de codificación ha desaparecido. Parece que hay un problema con @Lob. – Javi

1

Utilice la definición de @LOB, es correcto. La tabla está almacenando un OID en los catálogos -> postegreSQL-> tablas -> tabla pg_largeobject.

Los datos binarios se almacenan aquí de manera eficiente y JPA obtendrá los datos correctamente y los guardará para usted con esto como un detalle de implementación.

Cuestiones relacionadas