2017-06-28 58 views
1

我想使用createNativeQuery創建多個表,但它會導致只創建第一個表的hibernate。如果我將粘貼SQL複製到SQL編輯器,它工作正常。這裏是我的代碼:爲什麼hibernate只創建第一個表?

String sql = "CREATE TABLE \"languages\"("+ 
    "language_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ 
    "language_name VARCHAR(50) NOT NULL,"+ 
    "language_code VARCHAR(3) NOT NULL);"+ 

    "CREATE TABLE \"accountant\"("+ 
    "accountant_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ 
    "name VARCHAR(50) NOT NULL,"+ 
    "surname VARCHAR(50) NOT NULL,"+ 
    "mail VARCHAR(100) NOT NULL,"+ 
    "avatar VARCHAR(150),"+ 
    "phone VARCHAR(16),"+ 
    "interface_lang_id INTEGER NOT NULL,"+ 
    "FOREIGN KEY(interface_lang_id) REFERENCES languages(language_id) ON DELETE RESTRICT);"+ 

    "CREATE TABLE \"currency\"("+ 
    "currency_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ 
    "name VARCHAR(25) NOT NULL,"+ 
    "symbol VARCHAR(5) NOT NULL);";   
session.createNativeQuery(sql).executeUpdate(); 
+0

我不確定你可以使用JPA原生查詢執行DDL(CREATE,ALTER,DROP等..),但只有DML(SELECT,UPDATE,DELETE,INSERT等)。對於DDL操作,您應該使用' create'按照Sangram Badi建議的 –

+1

實際上,可以將DDL用於JPA本機查詢,因此Sangram Badi解決方案應該可以工作。 –

+0

@Aassass,是的,我認爲我的解決方案可能工作。 –

回答

1

createNativeQuery()用於執行單個原生SQL語句,而不是連續執行多個。

在你的情況下,你試圖用相同的調用執行3個不同的查詢,這就是創建第一個表後導致它停止的原因。

如果檢查documentation它說:

查詢createNativeQuery(字符串的SqlString)

執行本地SQL語句, 如創建查詢的情況下,對於更新或刪除。

解決方案:

你需要這3個查詢在createNativeQuery調用,使他們能夠獨立地解釋型動物中分離出來。

1

分割三創建查詢和執行session.createNativeQuery(sql).executeUpdate(); 3創建查詢。您已經寫了3個查詢來執行同一時間。這裏的createNativeQuery方法,在執行第一個create語句之後,它的遊標移動到下一行代碼。所以我認爲這是可能發生的問題。

以另一種方式,您可以在服務器啓動時自動創建表。創建3個表的bean,將所有必需的註釋放入bean中。然後將hibernate.cfg.xml文件更改爲<property name="hbm2ddl.auto">create</property>,然後在服務器啓動時創建表

相關問題