如何使用Hibernate创建数据库模式

5
阅读完Hibernate:生产环境中使用hbm2ddl.auto = update有风险吗?之后,我有几个问题。首先,我使用Hibernate的原因是为了使数据库供应商无关(不需要编写“相同”的10个版本的sql查询,例如tsql vs. sql)。
我的问题出现在创建数据库模式(生产环境)时。就我所知,我有两种选择。
  1. hbm2dll = update
  2. 纯sql(ddl)脚本。
第一种选择在上面的线程中广泛讨论。
第二个选择很差,因为这意味着我回到了我的第一个问题:“不想创建数据库供应商相关的sql语句”。 (如果“所有”(至少是Hibernate支持的数据库)都实现了DDL(用于定义和检查数据库结构的SQL子集),则此语句可能是错误的)。
4个回答

5

所有更改都应在开发/测试模式下进行,并在生产环境中手动(或自动)传输和执行脚本(但不要让hibernate运行它们)。由于hbm2ddl更新不能覆盖所有情况,这些脚本可能需要进行调整。

实际上,我从来没有让hibernate针对任何数据库运行ddl。我使用hbm2ddl生成文本:

org.hibernate.tool.hbm2ddl.SchemaExport --config=hibernate.cfg.xml --text --format --delimiter=;

org.hibernate.tool.hbm2ddl.SchemaUpdate --config=hibernate.cfg.xml --text --format --delimiter=;

抢先一步了解我。完全同意。 - Paul Sonier


3
通常用于转储JPA模式的工具是基于SchemaExport工具的,该工具仅读取静态元数据。
有一个Maven/Gradle插件https://github.com/Devskiller/jpa2ddl可以生成JPA模式。它包括所有属性、命名策略、用户类型等。
您还可以使用它来为Flyway生成自动化模式迁移。

1

我喜欢Hibernate(非常喜欢),我认为它可以生成一些非常高质量的代码,但是我不会让它在生产数据库上自由运行,就像我不会让一个非常有礼貌的灰熊来照顾婴儿一样。虽然一切可能会很顺利,但如果出了问题,那后果就真的很严重。

我的建议是,在测试环境中使用Hibernate生成数据库模式。在测试环境中测试这些模式。然后将这些脚本带到生产环境并运行。请注意,即使测试非常成功,我仍然不会允许Hibernate在生产服务器上自由运行。取Hibernate schemagen的输出,进行测试,并在验证后将其部署到生产服务器上。


1
不是想对立,但你看了我的问题吗? - Schildmeijer
我明白了,我的回答是否表明我没有理解你的问题? - Paul Sonier
你的回答中的第一句话。 - Schildmeijer
哦,我明白了。就像我说的,我并不想对抗。我会删除那第一行的。谢谢你分享的想法;可惜在stackoverflow上不可能(据我所知),但这是一个好想法。 - Paul Sonier
没有任何情感上的不满,感谢你的帮助。我相信我现在已经下定决心,在开发环境中只使用“更新”操作,并在生产环境中使用“SQL脚本”来创建数据库。 - Schildmeijer

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