5

我正在使用 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.createTable(Class)

4

2 回答 2

3

您需要将以下属性添加到您的配置中:

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

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

其他可能的选项:

  • validate:验证模式,不更改数据库。
  • 更新:更新架构。
  • create:创建模式,销毁以前的数据。
于 2013-06-08T11:58:00.643 回答
1

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

新的 Configuration().configure().buildSessionFactory();

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

于 2013-06-08T12:48:04.520 回答