2010-11-18 22 views
9

Ho un problema con Hibernate e PostgreSQL per la produzione e HSQLDB per il test.
Sto utilizzando un approccio top-down che consente a Hibernate di creare lo schema del database.
Sto anche usando le annotazioni; mappatura parte hibernate.cfg.xml contiene solo le linee come
<mapping class="package.subpackage.ClassName" />
Hibernate variabili default stringa a carattere variabile (255) su PostgreSQL che non è sufficiente per me in alcuni casi, quindi devo ridefinire alcune colonne manualmente utilizzando
@Column(columnDefinition = "TEXT").
Tuttavia, il tipo di TESTO non è valido per HSQLDB, pertanto non è possibile creare tali tabelle.

Qualcuno può aiutare a risolvere questo?Hibernate postgresql/hsqldb Problema di incompatibilità della colonna TEXT

+0

Hai provato a utilizzare Postgres anche per il test? Se sì, che tipo di problemi hai incontrato? –

+0

Sì, uso Postgres anche per i test. Nessun problema, solo problema di incompatibilità hsqldb – Nemanja

risposta

10

Il modo più semplice per affrontare questo problema specifico è probabilmente non utilizzare il ColumnDefinition a tutti e invece per specificare esplicitamente la lunghezza della colonna con (per esempio)

@Column(length=10000) 

Potrebbe anche essere che si potrebbe invece mapparlo con @Lob (type = LobType.CLOB)

ma non sono sicuro che sia supportato correttamente in HSQLDB. In Postgres dovrebbe darti il ​​tuo tipo di TESTO.

+0

Sì, grazie, la lunghezza fa il trucco! – Nemanja

+1

Sì, questa è la soluzione più semplice, ma preferirei l'uso di HSQLDB con la modalità di compatibilità postgres. –

-5

Sì, si dispone di un problema davvero grande.

NON UTILIZZARE UN MOTORE DI DATABASE PER LE PROVE E UN ALTRO PER LA PRODUZIONE.

È possibile riscontrare problemi che non si sono mai sognati.

+0

Sì, grazie, avevo questo in mente e ho organizzato test in modo che possano essere eseguiti facilmente su entrambi i database. Ma recentemente ho avuto questo piccolo cambiamento e hsqldb ha iniziato a creare problemi. – Nemanja

+19

Sì e No. Accetto che l'ambiente di test ** dovrebbe essere ** esattamente come l'ambiente di produzione. Ma i test unitari sono qualcosa di diverso: l'uso di un database in memoria (come Apache Derby o HSQLDB) è perfetto. E per di più: ha molti vantaggi. –

+0

Questo commento è probabilmente l'argomento migliore per l'utilizzo di più di un motore di database per il test e la produzione, considerando il tipo di progetto in cui è necessario distribuire l'artefatto in molti ambienti. –

6

HSQLDB 2.1 e versioni successive ha una modalità di compatibilità PostgreSQL e supporta il tipo di dati TEXT in questa modalità.

8

Accetto con @fredt. Il tipo di dati TEXT non è un tipo SQL standard, ma un'estensione supportata da alcuni motori.

Per abilitare la modalità di compatibilità PostgreSQL utilizzare i parametri di connessione sql.syntax_pgs=true.

2

Per far funzionare H2 in modalità compatibilità con PostgreSQL (utile per il test di 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 tabella di creazione PG_CLASS è necessaria per consentire a Hibernate/JPA di funzionare correttamente. Ma a parte questo - piuttosto senza soluzione di continuità.

Problemi correlati