为什么hibernate只创建第一个表?

时间:2017-06-28 14:37:45

标签: java sql hibernate

我想使用createNativeQuery创建多个表,但它会导致hibernate只创建第一个表。如果我将SQL粘贴到SQL编辑器,它可以正常工作。这是我的代码:

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();

2 个答案:

答案 0 :(得分:1)

拆分3创建查询并执行session.createNativeQuery(sql).executeUpdate(); 3次创建查询。您已经编写了3个查询来执行同一时间。这里是createNativeQuery方法,在执行1st create语句后,它的光标移动到下一行代码。所以我认为这是可能发生的问题。

另一种方法是,您可以在服务器启动时自动创建表。为3表创建bean,将所有必需的注释放入bean中。然后将hibernate.cfg.xml文件更改为<property name="hbm2ddl.auto">create</property>,然后在服务器启动时创建表

答案 1 :(得分:1)

createNativeQuery()用于执行单个本机SQL语句,而不是连续多个SQL语句。

在您的情况下,您尝试使用相同的调用执行3个不同的查询,以及在创建第一个表后导致其停止的内容。

如果您选中 documentation ,则说明:

  

查询createNativeQuery(String sqlString)

     

创建Query实例以执行本机SQL语句,   例如,用于更新或删除。

<强>解决方案:

您需要在不同的createNativeQuery调用中分隔这3个查询,以便可以单独解释它们。