如何在Hibernate中第一次创建数据库模式,并在模式修改时进行进一步更新?

18

我想第一次在Hibernate中创建数据库模式。如果模式有任何修改,比如添加新表或删除某些列,我希望更新现有的模式并保留以前的数据。

根据这个问题所给出的选项,似乎我要么可以创建破坏先前数据的模式,要么可以更新模式。

是否有一个值可以同时完成这两个操作?


你想自动化这个任务吗?换句话说,你会创建数据库超过一次吗? - Xorty
不,我不想创建数据库一次。正如我之前所说的,它应该在第一次创建,然后如果有任何修改,就应该使用数据库模式。 - M Sach
你尝试过保留“update”吗?“update”在两种情况下都无法工作吗? - Jayasagar
3个回答

33

实际上,我刚刚检查了<property name="hibernate.hbm2ddl.auto" value="update" />,它即使第一次创建表格,如果表格/模式存在,则会进行更新。

Update属性适用于启动或添加新模型时。您想保留先前保存的实体实例。这是默认的模式创建样式。

它尝试更新模式(如果需要)。支持以下更新:

请看我一些观察结果

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

非常有帮助 - 在其他地方没有找到这些信息。谢谢! - Alok P

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 将创建新的数据库。

1
有更现代的方法来完成模式初始化:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-initialize-a-database-using-hibernate - Yan Burtovoy

3

1
嗨,Kris。谢谢回复。实际上我现在只想知道,在Hibernate中是否可能创建数据库架构,如果架构不存在,则更新该架构(如果已经存在),并使用属性hibernate.hbm2ddl.auto的某些值来修改hbm文件。 - M Sach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接