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
risposta
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.
Sì, grazie, la lunghezza fa il trucco! – Nemanja
Sì, questa è la soluzione più semplice, ma preferirei l'uso di HSQLDB con la modalità di compatibilità postgres. –
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.
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
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. –
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. –
HSQLDB 2.1 e versioni successive ha una modalità di compatibilità PostgreSQL e supporta il tipo di dati TEXT in questa modalità.
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
.
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à.
Hai provato a utilizzare Postgres anche per il test? Se sì, che tipo di problemi hai incontrato? –
Sì, uso Postgres anche per i test. Nessun problema, solo problema di incompatibilità hsqldb – Nemanja