如何在hibernate中第一次创建数据库模式,并在模式修改的情况下进一步更新它?

时间:2012-01-11 06:23:44

标签: java hibernate hbm2ddl

我想第一次在hibernate中创建数据库模式。此外,如果架构中有任何修改,例如添加新表或删除某些列,我想更新现有架构,保持以前的数据不变。

根据this question给出的选项,看起来我可以创建销毁先前数据的架构,或者我可以更新架构。

是否有任何价值可以同时做到?

3 个答案:

答案 0 :(得分:27)

实际上我刚刚检查<property name="hibernate.hbm2ddl.auto" value="update" />是第一次创建表,然后如果存在表/模式,它会更新。

启动或添加新模型时,

Update属性适用。您希望保留先前保存的实体实例。这是默认的架构创建样式。

如果需要,它会尝试更新架构。支持以下更新:

查看我的一些观察

  • 添加字段 - 将新列添加到表中。
  • 重命名字段 - 将新列添加到表中,而原始列保留但不再使用。 注意:旧列中的数据不会迁移到新列。
  • 删除字段 - 列保留但未使用。
  • 更改字段类型 - 列的类型不会更改,这可能会导致类型不匹配的异常。
  • 创建实体 - 创建新表。
  • 重命名实体 - 创建新表,而原始表保留。
  • 将实体移动到另一个文件夹 - 创建一个新表,而原始表保持不变。
  • 删除实体 - 表格保留。

答案 1 :(得分:4)

您可以使用'import.sql'。

在资源中添加import.sql文件,如下所示:

/*create database at first time*/ 
CREATE SCHEMA your-database-name;

并在'hibernate.cfg.xml'中添加一行,如下所示:

<hibernate-configuration>
    <session-factory>
       ...
       ...
       <property name="hbm2ddl.import_files">import.sql</property>
       ...
       ...
    </session-factory>
</hibernate-configuration>

因此,如果数据库不存在,hibernate会创建新的数据库。

答案 2 :(得分:1)

我不建议根据实体更改更新数据库模式。尝试使用FlywayLiquibase。  您可以在stackoverflow上找到类似的问题,例如。 Hibernate/JPA DB Schema Generation Best Practices