Java Hibernate/JPA DB模式生成最佳实践
我只是想听听Hibernate专家对基于Hibernate/JPA项目的DB模式生成最佳实践的看法。特别是:Java Hibernate/JPA DB模式生成最佳实践,java,hibernate,jpa,Java,Hibernate,Jpa,我只是想听听Hibernate专家对基于Hibernate/JPA项目的DB模式生成最佳实践的看法。特别是: 项目刚开始时使用什么策略?建议让Hibernate在此阶段自动生成模式,还是从项目的最早阶段手动创建数据库表更好 假设在整个项目中使用Hibernate生成模式,那么在系统发布到生产环境之前禁用自动模式生成并手动创建数据库模式是否更好 系统投入生产后,维护实体类和DB模式(例如添加/重命名/更新列、重命名表等)的最佳实践是什么 通常建议手动生成模式,最好使用支持数据库模式修订的工具,如g
尽管存在争议,但我认为这三个问题的答案都是:让hibernate自动生成模式中的表 到目前为止,我还没有遇到任何问题。您可能需要不时手动清理某些字段,但这与单独跟踪DDL脚本(即管理其修订并将其与实体更改同步)相比并不令人头痛(反之亦然) 对于在生产环境中部署-一个明显的提示-首先确保在测试环境中生成的所有内容都正常,然后手动在生产环境中部署。,因为:
我会对通过同一ORM层访问的独立应用程序或数据库使用自动生成,如果应用程序需要移植到不同的数据库,也会使用自动生成。它不需要编写和维护特定于DB供应商的DDL脚本,从而节省了大量的时间 正如Bozhidar所说,不要让Hibernate创建和更新数据库模式。 让您的应用程序创建和更新数据库架构。
对于java来说,最好的工具是。您需要使用描述数据库模式的DDL语句创建一个或多个SQL文件。然后通过Flyway执行这些SQL文件。有关更多信息,请查看。的网站。我相信这里讨论或争论的很多内容也应该与您是否更熟悉代码优先或数据库优先的方法有关
就个人而言,我更倾向于后者,参考单一责任原则(SRP),我更喜欢由DB专家处理DB,由应用程序专家处理应用程序,而不是由应用程序处理DB。此外,我认为,一开始走太多的捷径会很好,但随着事情的发展,会产生难以管理的问题。我想,这么大的问题很大程度上取决于您的项目以及它是否可以接受:-集中部署(例如,基于JEE的部署)vs client server like-允许在任何时候使用多个客户端版本(=>关注数据库列删除、完整性约束等)-热部署vs stop应用程序已被接受-…但假设您必须以导致创建新表的方式更改生产环境中的实体关系,一些曾经是旧表的一部分的数据必须插入到这些新表中。例如,假设您有一个名为Person的实体,其中包含地址信息字段,现在您希望创建一个单独的实体来保存地址信息。这将导致创建一个新表,您必须将地址数据从person表迁移到此新表。但是Hibernate不能自动做到这一点……我个人强烈反对这种方法。尤其是在谈到生产时。对我来说,对过程的控制不够,这里有太多的魔力。Liquibase为您解决了“单独跟踪DDL脚本-即管理其修订并将其与实体更改同步(反之亦然)”的问题。您已经清楚地了解了对db scheme应用了哪些更改。通过自动生成表,您根本没有任何版本控制。这个