【问题标题】:Proper way to use liquibase along with Spring JPA/Hibernate?使用 liquibase 和 Spring JPA/Hibernate 的正确方法?
【发布时间】:2017-09-25 10:22:01
【问题描述】:
我有点困惑。我想将关系数据库(Postgres 或 MySQL)与 Spring JPA 一起使用。我喜欢这些注释,你可以如何定义模型和它们之间的关系、连接和使用存储库。根据我的阅读,似乎不建议使用 Hibernate 的自动 DDL 生成功能,应该禁用。这是有道理的,我想通过更稳定的 liquibase 跟踪代码中的数据库更改。
现在是我难以理解的令人困惑的部分。我仍然可以使用 JPA 注释来定义 @OneToMany 或 @JoinColumn 之类的东西吗?这正是我通过 liquibase 中的变更集所做的事情。我们应该继续使用注解,还是更愿意?
有人可以解释一下这个工作流程,或者指向概述结合使用 Liquibase、Spring Data JPA 的正确方法的文档吗?
【问题讨论】:
标签:
hibernate
jpa
spring-data-jpa
liquibase
【解决方案1】:
使用 Liquibase AND 注释不仅没问题,而且可能是最常见的用例。
注释的用途与 Liquibase 截然不同。它们描述了如何将 Java 代码片段映射到数据库模式。
Liquibase 创建并发展了这个数据库模式。
注释不包含有关架构不同版本的信息。这就是为什么您不应该将 Hibernates DDL 生成用于您的实际生产模式,尽管它在某种程度上可能适用于开发和测试。当然,在某些时候,您应该使用生成的模式来测试您的应用程序,该模式生成的方式与为生产环境生成的方式完全相同。
Liquibase 没有关于如何从您的架构映射到 Java 对象并返回的信息。
当然,有重叠。如果您的注释说某个字段应该映射到表 t 中的列 x,Liquibase 应该使用该列(以及 Hibernate 期望的类型)创建该表。
我通常这样做的方式是:
- 创建我的 Java 对象模型
- 使用 Hibernate 创建 DDL 脚本/架构。查看架构并调整映射,直到架构看起来符合要求。
- 再次创建 DDL 并将其用作配置我的迁移工具(Liquibase 或其他)的基础。在此过程中针对与映射无关的内容再次调整脚本:约束和索引的名称、附加索引和约束、权限、存储选项。
- 确保有适当的测试来测试使用 Liquibase 迁移的基本 CRUD 操作。
当然,如果您从数据库模型开始,您的流程可能看起来会大不相同。