2017-02-09 44 views
11

实际上我正在开发我的Spring启动应用程序项目,并且我注意到有时在另一台服务器(SQL Server)上有时会连接到我的数据库,特别是当我尝试使用FlyWay执行一些脚本迁移时,经过几次尝试。然后我注意到,我没有在我的属性spring.jpa.hibernate.ddl-auto中指定。然后我做了一些研究,发现它建议在开发中添加 spring.jpa.hibernate.ddl-auto= create-drop。 并将其更改为:spring.jpa.hibernate.ddl-auto= none正在生产中。但是我没有真正理解它是如何工作的,以及hibernate如何使用create value或none来生成数据库模式。您可以请技术上解释它是如何工作的,以及在开发和生产服务器中使用此属性的建议是什么。 谢谢spring.jpa.hibernate.ddl-auto属性在Spring中如何工作?

+0

FWIW JPA 2.1有一个_standard_属性javax.persistence.schema-generation.database.action,因此实际上并不需要使用JPA供应商特定的属性来生成模式。 –

回答

22

有关记录,spring.jpa.hibernate.ddl-auto属性是特定于Spring Data JPA,并且是它们指定最终将传递给Hibernate的值的方法,该值属性为hibernate.hbm2ddl.auto

createcreate-dropvalidate,并update基本上影响架构管理工具将如何处理在启动数据库模式。

例如,update操作将查询JDBC驱动程序的API以获取数据库元数据,然后Hibernate根据读取的注释类或HBM XML映射比较其创建的对象模型,并尝试调整模式-飞。

例如,update操作将尝试添加新列,约束等,但不会删除以前可能存在但不再作为先前运行的对象模型的一部分的列或约束。

通常在测试用例场景中,您可能会使用create-drop,以便创建模式,测试用例添加一些模拟数据,运行测试,然后在测试用例清理期间删除模式对象,留下一个空的数据库。

在开发过程中,通常会看到开发人员使用update自动修改架构以在重新启动时添加新的添加项。但是再次明白,这不会删除以前执行中不再需要的列或约束。

在生产中,通常强烈建议您使用none或者根本不指定此属性。这是因为数据库管理员通常会检查数据库更改的迁移脚本,特别是如果您的数据库跨多个服务和应用程序共享。

+1

是的,从来没有在生产中使用ddl代。我们使用ddl为表结构生成初始脚本,并在该过程中涉及DBA。然后,我们将db脚本作为部署单元的一部分,并在部署应用程序时使用Flyway执行它们。当我们需要修改数据库时,我们将新脚本添加到下一个版本的应用程序并部署到分段。 Flyway将自动检测当前版本并运行将数据库转换为最新版本所需的脚本。如果一切正常,我们将部署到生产环境 –

+0

如果我们不指定此属性,该怎么办?例如我有我自己的 ... 更新 我有这个和由于某种原因,我的表总是下降,直到我加入上述属性;; PS:对代码示例抱歉) –

+0

我有H2和春季启动决定它必须使用”创建 - 删除“,我想这覆盖了我设置的属性 https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html –