2013-10-09 8 views
6

Ich wollte ein Projekt mit Hibernate, Federmvc und H2 als (vorerst) in der Speicher-DB einrichten. Wenn alles bootet (in Jetty) bekomme ich Fehler, dass die Tabellen noch nicht vorhanden sind.H2 In-mem-DB mit Hibernate-Set zum Erstellen von mir Tabelle nicht gefunden Fehler

Dies ist der Fehler, den ich bekommen:

Okt 09, 2013 3:42:47 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
INFO: HHH000227: Running hbm2ddl schema export 
Okt 09, 2013 3:42:47 PM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: alter table PUBLIC.Object drop constraint FK_9sd2x4ehbugdjyrp1xqmsjw00 
Okt 09, 2013 3:42:47 PM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: Tabelle "OBJECT" nicht gefunden 
Table "OBJECT" not found; SQL statement: 
... 

Das wäre in Ordnung, wenn ich Hibernate nicht gesetzt war wie folgt aus:

hibernate.hbm2ddl.auto=create 

und die Verbindungszeichenfolge für H2 ist dies:

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE 

ich an die DB mit IntelliJ verbinden kann, so dass es dort ist ..

Ich erwartete Hibernate, um die Tabellen für mich und dann die Einschränkungen und was auch immer sonst folgt, aber aus irgendeinem Grund nicht zu tun. Könnte es ein Benutzerrecht sein? Dies sind die Benutzereinstellungen, die ich eingerichtet habe:

jdbc.user=sa 
jdbc.pass= 

Jede Hilfe ist willkommen! Thanks :)

UPDATE

Wenn ich die Verbindungszeichenfolge, um diese Änderung:

jdbc.url=jdbc:h2:~/db/database.db;DB_CLOSE_ON_EXIT=TRUE;INIT=create schema IF NOT EXISTS generic; 

es scheint zu funktionieren. Aber warum funktioniert es nicht im Speicher und warum hat es vorher nicht funktioniert, als ich das Standardschema auf "public" gesetzt habe (was schon da war, also dachte ich, könnte auch einfach meine Sachen dort dumpen ...) IDK!

+0

Warum Hibernate fallen nicht Fremdschlüssel in einer leeren Datenbank? Versuchen Sie, die SQL-Protokollierung zu aktivieren, um zu sehen, wie Hibernate versucht, das vorhandene Datenbankschema zu untersuchen. –

+0

es hat nicht einmal versucht, zuerst eine Tabelle zu erstellen oder zu prüfen, ob man da ist, es hat gerade versucht, die Schlüssel direkt fallen zu lassen. Hölle, ich weiß nicht, warum es das tut. Ich bekomme immer noch den gleichen Fehler beim "ersten" Lauf auf der DB, aber danach sind die Tabellen da und es funktioniert mit ihnen ... sehr seltsam – pascalwhoop

+0

Der Fehler schlägt vor, dass Sie nicht die Datenbank verwenden, die Sie denken. Überprüfen Sie die Konfiguration noch einmal, setzen Sie Haltepunkte und debuggen Sie dies. –

Antwort

0

Das klingt wie https://hibernate.atlassian.net/browse/HHH-7002.

In meinem Fall konnte ich die Ausnahmen beseitigen, indem Hibernate Konfiguration der folgenden Klasse über die hibernate.dialect Eigenschaft in persistence.xml zu verwenden:

import org.hibernate.dialect.H2Dialect; 

// This class is a workaround for https://hibernate.atlassian.net/browse/HHH-7002 
public class CustomH2Dialect 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; 
    } 

    @Override 
    public boolean supportsIfExistsBeforeTableName() { 
     return true; 
    } 

    @Override 
    public boolean supportsIfExistsAfterTableName() { 
     return false; 
    } 

    @Override 
    public String getCascadeConstraintsString() { 
     return " CASCADE "; 
    } 
} 

(Dank https://stackoverflow.com/a/20698339/14379)

Verwandte Themen