2013-10-09 52 views
6

我想建立一個項目與休眠,彈簧mvc和H2作爲(現在)在內存數據庫。 當一切都啓動(在碼頭)時,我收到錯誤表示表格尚未出現。H2內部數據庫與休眠設置創建給我表沒有發現錯誤

這是錯誤我得到:

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: 
... 

,如果我沒有設置休眠如這這將是確定:

hibernate.hbm2ddl.auto=create 

和H2連接字符串是這樣的:

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

我可以使用IntelliJ連接到數據庫,所以它在那裏..

我希望Hibernate能夠爲我生成表格,然後是約束條件和其他任何遵循的內容,但由於某些原因,它不會那樣做。它可能是一個用戶權利的事情?這些是我設置的用戶設置:

jdbc.user=sa 
jdbc.pass= 

任何幫助表示讚賞! 謝謝:)

UPDATE

如果我的連接字符串改成這樣:

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

它似乎工作。但是爲什麼它在內存中不起作用,爲什麼當我將默認模式設置爲「公共」時(它已經存在,所以我想不妨將我的東西轉儲到那裏......)IDK!

+0

爲什麼休眠下降外鍵在空數據庫上?嘗試啓用SQL日誌記錄來查看Hibernate如何嘗試檢查現有的數據庫模式。 –

+0

它甚至沒有嘗試首先創建表格,或者檢查是否存在表格,直接嘗試刪除鍵。地獄我不知道它爲什麼這樣做。我仍然在數據庫上的「第一次」運行中遇到同樣的錯誤,但在此之後,表格就在那裏,並且與它們一起工作......非常奇怪 – pascalwhoop

+0

錯誤表明您沒有使用您認爲的數據庫。再次檢查配置,設置斷點並對其進行調試。 –

回答

0

這聽起來像是https://hibernate.atlassian.net/browse/HHH-7002

在我的情況,我能夠通過配置Hibernate來消除例外的persistence.xml通過hibernate.dialect財產使用下面的類:

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 "; 
    } 
} 

(感謝https://stackoverflow.com/a/20698339/14379