2014-05-25 8 views
19

Ho aggiornato un'applicazione a Grails 2.4.0 e sto usando il plugin hibernate4. Quando si esegue l'app di esecuzione, gli esempi di errore riportati di seguito vengono generati per ogni classe di dominio utilizzando il database in memoria. Ho letto diversi post sui forum di ibernazione che gli errori non sono gravi. Sta semplicemente registrando un errore perché la tabella che sta tentando di eliminare non esiste ancora.Errori Grails 2.4 e hibernate4 con run-app

2014-Mai-24 13: 25: 26.788 ERRORE [localhost-StartStop-1] org.hibernate.tool.hbm2ddl.SchemaExport - SchemaExport.java 425 - HHH000389: non riuscita: alter table user_role goccia vincolo FK_apcc8lxk2xnug8377fatvbn04 se esiste

2014-Mai-24 13: 25: 26,789 ERRORE [localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport - SchemaExport.java 426 - Tabella "USER_ROLE" non trovata; SQL: alter table user_role goccia vincolo FK_apcc8lxk2xnug8377fatvbn04 se esiste [42.102-173]

Qualcuno sa come fermare il rumore di registrazione?

+0

stai usando il plugin di sicurezza Spring? – luisZavaleta

+0

Sì, lo sto usando. – Ken

risposta

24

È un bug, sembra che tu possa lasciarlo in questo modo e non causerà problemi, ma se non vuoi vedere il messaggio qui ci sono alcune soluzioni: (Modifica: l'opzione 2 sembra funzionare meglio (vedi commenti in questo post))

1.- configurazione singleSession da DataSource.groovy

https://jira.grails.org/browse/GRAILS-11198

2.- sovrascrivendo il dialetto H2:

public class ImprovedH2Dialect extends H2Dialect { 
    @Override 
    public String getDropSequenceString(String sequenceName) { 
     // Adding the "if exists" clause to avoid warnings 
     return "drop sequence if exists " + sequenceName; 
    } 

    @Override 
    public boolean dropConstraints() { 
     // We don't need to drop constraints before dropping tables, that just 
     // leads to error messages about missing tables when we don't have a 
     // schema in the database 
     return false; 
    } 
} 

Unsuccessful: alter table XXX drop constraint YYY in Hibernate/JPA/HSQLDB standalone

+1

L'opzione 1 non ha funzionato, ma l'opzione 2 lo ha fatto. Grazie! – Ken

+1

Molto bello! Ho usato # 2. Ho aggiornato da Hibernate3 a Hibernate4 (usando Grails 2.3.11, ma non penso che abbia avuto importanza e ho iniziato a ricevere questi messaggi .Soddisfacente.) Sono stato felice di trovare questa Q & A. –

+5

L'opzione 2 ha funzionato alla grande. dialect = com.mypackage.ImprovedH2Dialect' a te DataSource.groovy – 10GritSandpaper

7

La soluzione @Luis fornita sopra funziona anche per MYSQL. Basta estendere MySQL5InnoDBDialect invece come di seguito:

import org.hibernate.dialect.MySQL5InnoDBDialect; 

public class ImprovedMySQLDialect extends MySQL5InnoDBDialect { 
    @Override 
    public String getDropSequenceString(String sequenceName) { 
     // Adding the "if exists" clause to avoid warnings 
     return "drop sequence if exists " + sequenceName; 
    } 

    @Override 
    public boolean dropConstraints() { 
     // We don't need to drop constraints before dropping tables, that just leads to error 
     // messages about missing tables when we don't have a schema in the database 
     return false; 
    } 
} 

Poi nel file di origine dati cambiare la seguente riga:

dialect = org.hibernate.dialect.MySQL5InnoDBDialect 

a

dialect = my.package.name.ImprovedMySQLDialect 
6

Basta impostare dbCreate="update", e gli errori vanno via subito.

Il problema è che GORM (ibernazione) sta tentando di eliminare tabelle nel DB H2 che non sono mai state create perché il DB viene creato ogni volta che si esegue l'app. Sfortunatamente, dbCreate è impostato su create-drop per impostazione predefinita, il che non ha alcun senso per un database creato al volo in fase di runtime.

development { 
    dataSource { 
     dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', '' 
     url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE" 
    } 
+1

Perché non cambiare semplicemente "create-drop" in "create" – borjab

+0

@borjab Non uso 'create' perché' create' distrugge i dati precedenti. Durante lo sviluppo, carico i dati del test con 'BootStrap.groovy'. Quando cambio un oggetto dominio mentre il server è in esecuzione, GORM aggiorna lo schema dopo che la classe è stata ricompilata e ricaricata. Questo cancella tutti i dati di test che carico con bootstrap. Quindi finisco per dover riavviare l'app, che mi rallenta e uccide il mio flusso. – 10GritSandpaper