删除和重新创建数据库后强制休眠创建表

Posted

技术标签:

【中文标题】删除和重新创建数据库后强制休眠创建表【英文标题】:Force Hibernate To Create Tables After Dropping and Recreating database 【发布时间】:2013-06-04 15:43:49 【问题描述】:

我正在使用 java 2 ee 开发一个 Web 应用程序。我也使用休眠和mysql。 为了恢复备份文件,在我的应用程序的某个时刻,我需要删除当前数据库并重新创建它,我这样做如下:

    Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/?user=user&password=pass");
    Statement statement = (Statement) conn.createStatement();
    statement.executeUpdate("DROP DATABASE tcs;");
    statement.executeUpdate("CREATE DATABASE tcs charset=utf8 collate=utf8_persian_ci;");

删除并重新创建后,我需要使用默认用户(弹簧安全用户)初始化数据库

    User admin = new User();
    UserAuthority ROLE_USER = new UserAuthority("ROLE_USER");
    ROLE_USER.save();
    admin.addUserAuthority(ROLE_USER);
    admin.setEnabled(true);

    admin.save();

但在最后一行应用程序抛出了这个异常

Hibernate: insert into roles (authority) values (?)
[DEBUG][16:19:17,734] [http-bio-8080-exec-10] NewPooledConnection:367  com.mchange.v2.c3p0.impl.NewPooledConnection@bcbe33a handling a throwable.
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'tcs.roles' doesn't exist

我知道 hibernate 在启动时会创建表,但在这种情况下,它无法在 drop/recreate 之后重新创建表,那么如何强制 hibernate 再次创建表? 或者假设有类似Hibernate.createTable(Class) 的东西?

【问题讨论】:

【参考方案1】:

对于未来的谷歌员工: 毕竟它是如此简单,我只需要构建会话工厂,所以我添加了这一行,它就像魅力一样工作:

新配置().configure().buildSessionFactory();

请注意 buildSessionFactory() 在 hibernate 4 中已弃用,但我想您可以使用代码 here 来做同样的事情。

【讨论】:

【参考方案2】:

您需要在配置中添加以下属性:

每次创建和销毁 SessionFactory 时删除并重新创建:

<property name="hbm2ddl.auto">create-drop</property>

其他可能的选择:

validate:验证架构,不更改数据库。 更新:更新架构。 create:创建架构,销毁以前的数据。

【讨论】:

这条线不是在每次启动时都会删除和创建吗? 不,还是同样的问题。 它已经更新了,它在启动时工作但在运行时不工作,我需要一些如何再次触发它 在这种情况下,您的数据库可能处于不一致状态。删除数据库一次,然后重试。 update 可以处理后续重启 我试过了,不行,也许hibernate毕竟不支持

以上是关于删除和重新创建数据库后强制休眠创建表的主要内容,如果未能解决你的问题,请参考以下文章

EF 代码优先 - 删除然后创建数据库后播种

django 删除数据库表后重新同步的方法

在内存数据库中嵌入 HSQL 的 Spring DataSource 和 Linux 上的休眠创建-删除排序

Terraform不断强制重新创建资源(先删除再创建)]]

SSDT 在没有任何更改时删除并重新创建表

创建表时的休眠异常