2010-11-18 13 views
9

Tengo un problema al utilizar Hibernate y PostgreSQL para la producción y HSQLDB para la prueba.
Estoy usando un enfoque descendente que permite a Hibernate crear el esquema de la base de datos.
También estoy usando anotaciones; parte mapeo de hibernate.cfg.xml sólo contiene líneas como
<mapping class="package.subpackage.ClassName" />
las variables por defecto de Cuerda Hibernate para diferentes caracteres (255) en PostgreSQL que no es suficiente para mí en algunos casos, por lo que tengo que redefinir algunas columnas utilizando manualmente
@Column(columnDefinition = "TEXT").
Pero, el tipo de texto no es válido para HSQLDB, por lo que esas tablas no se pueden crear.

¿Alguien puede ayudar a resolver esto?Hibernate postgresql/hsqldb Problema de incompatibilidad de columna TEXT

+0

¿Ha intentado usar Postgres para las pruebas también? En caso afirmativo, ¿qué tipo de problemas has conocido? –

+0

Sí, también uso Postgres para las pruebas. No hay problema con eso, solo problema de incompatibilidad hsqldb – Nemanja

Respuesta

10

La manera más fácil de hacer frente a este problema específico es, probablemente, a no usar el ColumnDefinition en absoluto y en lugar de especificar explícitamente la longitud de la columna con (por ejemplo)

@Column(length=10000) 

También podría ser que en su lugar podría asignarlo con @Lob (tipo = LobType.CLOB)

pero no estoy seguro de que sea compatible correctamente en HSQLDB. En Postgres debería darle su tipo de TEXTO.

+0

Sí, gracias, la duración es suficiente. – Nemanja

+1

Sí, esta es la solución más simple, pero preferiría el uso de HSQLDB con el modo de compatibilidad postgres. –

-5

Sí, tiene problema realmente grande.

NO USE UN MOTOR DE BASE DE DATOS PARA LAS PRUEBAS, Y OTRO PARA LA PRODUCCIÓN.

Puedes encontrar problemas que nunca soñaste.

+0

Sí, gracias, tenía eso en mente y organicé pruebas para que puedan ejecutarse fácilmente en ambas bases de datos. Pero recientemente tuve este pequeño cambio y hsqldb comenzó a crear problemas. – Nemanja

+19

Sí y no. De acuerdo en que el entorno de prueba ** debe ser ** exactamente como el entorno de producción. Pero las pruebas unitarias son algo diferente: el uso de una base de datos en memoria (como Apache Derby o HSQLDB) está perfectamente bien. Y lo que es más: tiene muchas ventajas. –

+0

Este comentario es probablemente el mejor argumento para usar más de un motor de base de datos para pruebas y producción, teniendo en cuenta el tipo de proyecto donde tiene que implementar el artefacto en muchos entornos. –

6

HSQLDB 2.1 y posterior tiene un modo de compatibilidad PostgreSQL y admite el tipo de datos TEXTO en este modo.

8

De acuerdo con @fredt. El tipo de datos TEXT no es un tipo de SQL estándar, sino una extensión que admite algunos motores.

Para habilitar Modo de compatibilidad PostgreSQL use sql.syntax_pgs=true en sus parámetros de conexión.

2

Para que H2 funcione en modo de compatibilidad con PostgreSQL (útil para pruebas junit).

# JDBC Driver 
jdbc.driverClassName=org.h2.Driver 
jdbc.url=jdbc:h2:mem:play;MODE=PostgreSQL;TRACE_LEVEL_SYSTEM_OUT=2;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;INIT=CREATE TABLE IF NOT EXISTS PG_CLASS (RELNAME text, RELKIND text); 
jdbc.username=sa 
jdbc.password= 

# general hibernate options 
hibernate.database=h2 
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect 

La tabla de creación PG_CLASS es necesaria para permitir que Hibernate/JPA funcione correctamente. Pero aparte de eso, bastante perfecto.

Cuestiones relacionadas