Hibernate/JPA DB Schema Generation最佳实践

Lam*_*bda 40 java hibernate jpa

我只想听听Hibernate专家关于基于Hibernate/JPA项目的数据库模式生成最佳实践的意见.特别:

  1. 项目刚刚开始时使用什么策略?是否建议让Hibernate在此阶段自动生成模式,还是最好从项目的最早阶段手动创建数据库表?

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

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

Boz*_*sov 37

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

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

  3. 您对实体进行更新并创建匹配的更新脚本(修订版)以更新数据库模式以反映实体更改.您可以创建一个自定义解决方案(我写了一些)或使用更流行的东西,如liquibase(它甚至支持架构更改回滚).如果您正在使用构建工具(如maven或ant),则建议将db schema update util插入构建过程,以便新构建与架构保持同步.


Boz*_*zho 13

虽然有争议,我会说所有3个问题的答案是:让hibernate自动生成模式中的表.

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

对于生产部署 - 一个明显的提示 - 首先确保在测试环境中生成所有内容然后在生产中部署.

  • 就个人而言,我强烈反对这种做法.特别是在谈论生产时.对我来说,对这个过程没有足够的控制权,而且这里有太多的魔法. (3认同)
  • Liquibase 为您解决了所有“单独跟踪 DDL 脚本 - 即管理其修订并将其与实体更改同步(反之亦然)”的问题。并且您清楚地了解应用了数据库方案的哪些更改。通过自动表生成,您根本不需要任何类型的版本控制。有些更改可能会影响您的数据,并且您可能会丢失它们。它对于生产来说完全不安全,仅对于开发环境而言。 (2认同)

Doj*_*ojo 5

手动,因为:

  1. 不同的应用程序可能使用相同的数据库,并非所有应用程序都使用hibernate甚至java.数据库模式不应该由ORM决定,它应该围绕数据和业务需求进行设计.
  2. hibernate选择的数据类型可能不适合应用程序.
  3. 如前面的评论中所述,如果数据丢失不可接受,对实体的更改将需要手动干预.
  4. 诸如连接表上的附加属性(通用术语而不是java属性)之类的东西在RDBMS中运行得非常好,但在ORM中使用起来有点复杂和低效.从ORM - > RDBMS执行此类映射可能会创建效率不高的表.理论上,可以使用hibernate生成的代码构建完全相同的连接表,但在编写实体时需要特别小心.

我将自动生成用于通过相同ORM层访问的独立应用程序或数据库,以及是否需要将应用程序移植到不同的数据库.通过不要求编写和维护DB供应商特定的DDL脚本,可以节省大量时间.


Cen*_*giz 5

就像 Bozhidar 说的,不要让 Hibernate 创建和更新数据库模式。让您的应用程序创建和更新数据库架构。对于 java,最好的工具是Flyway。您需要使用描述您的数据库架构的 DDL 语句创建一个或多个 SQL 文件。这些 SQL 文件然后由 Flyway 执行。有关更多信息,请查看Flyway站点。