Hibernate / JPA DB架构生成最佳实践

我只是想听听Hibernate专家对基于Hibernate / JPA的项目的DB模式生成最佳实践的看法。 特别:

  1. 项目刚开始时采用什么策略? build议让Hibernate在这个阶段自动生成模式还是从项目的最早阶段手动创build数据库表更好?

  2. 假设在整个项目中使用Hibernate生成模式,在系统发布到生产之前,是否更好地禁用自动模式生成并手动创build数据库模式?

  3. 在系统投入生产之后,维护实体类和数据库模式的最佳做法是什么(例如添加/重命名/更新列,重命名表等)?

  1. 总是build议手动生成模式,最好使用支持数据库模式修订的工具,比如Liquibase 。 从实体生成模式在理论上是伟大的,但在实践中是脆弱的,从长远来看导致很多问题(相信我)。

  2. 在制作中,最好手动生成并查看模式。

  3. 您对实体进行更新并创build一个匹配的更新脚本(修订版)来更新数据库模式以反映实体更改。 你可以创build一个自定义的解决scheme(我已经写了几个),或使用更stream行的东西像liquibase(它甚至支持模式更改回滚)。 如果您使用的是诸如maven或ant之类的构build工具,build议将db schema update util插入到构build过程中,以使新构build与模式保持同步。

虽然有争议,但我会说所有3个问题的答案是:让hibernate自动生成架构中的表。

到目前为止,我还没有遇到任何问题。 您可能需要不时地手动清理某些字段,但与单独loggingDDL脚本相比,这并不令人头疼 – 即pipe理其修订版并将其与实体更改同步(反之亦然)

对于部署生产 – 一个显而易见的技巧 – 首先确保在testing环境中生成一切正常,然后部署到生产环境。

手动,因为:

  1. 相同的数据库可能会被不同的应用程序使用,并不是所有的应用程序都会使用hibernate甚至java。 数据库模式不应该由ORM规定,它应该围绕数据和业务需求进行devise。
  2. 由hibernateselect的数据types可能不是最适合应用程序。
  3. 正如之前的评论所述,如果数据丢失是不可接受的,则对实体的更改将需要手动干预。
  4. 诸如连接表上其他属性(通用术语,不是Java属性)的东西在RDBMS中是非常有效的,但是在ORM中使用起来有点复杂和低效。 从ORM – > RDBMS执行这样的映射可能会创build无效的表。 从理论上讲,使用hibernate生成的代码可以构build完全相同的连接表,但在编写实体时需要特别注意。

我会使用自动生成单独的应用程序或通过相同的ORM层访问的数据库,如果应用程序需要移植到不同的数据库。 这将节省大量时间,不需要编写和维护数据库供应商特定的DDL脚本。

像Bozhidar说的,不要让Hibernate创build和更新数据库模式。 让您的应用程序创build并更新数据库模式。 对于Java来说,最好的工具是Flyway 。 您需要使用描述数据库模式的DDL语句创build一个或多个SQL文件。 这些SQL文件然后由Flyway执行。 欲了解更多信息,请查看Flyway的网站。

我相信,如果你对代码优先或数据库优先的方法更加舒适,那么这里讨论或讨论的很多东西也应该是相关的。

就我个人而言,我更倾向于select后者,并且参考单一职责原则(SRP),我宁愿让DB专家处理数据库和处理应用程序的应用程序专家,而不是让应用程序处理数据库。 另外,我认为采取太多的捷径可以在一开始就很好地工作,但是随着事物的增长/发展,会产生难以pipe理的问题。