我正在处理我的Spring启动应用程序项目并注意到,有时在另一台服务器(SQL Server)上的数据库中存在连接超时错误。
当我尝试使用FlyWay
进行一些脚本迁移时,会发生这种情况,但是在多次尝试后它都能正常工作。
然后我注意到我没有在属性文件中指定spring.jpa.hibernate.ddl-auto
。我做了一些研究,发现建议添加
spring.jpa.hibernate.ddl-auto= create-drop
正在开发中。
并在生产中将其更改为:spring.jpa.hibernate.ddl-auto= none
。
但我实际上并没有理解它是如何工作的以及hibernate如何使用create-drop
或none
值生成数据库模式。您能否从技术上解释它是如何工作的,以及在开发和生产服务器中使用此属性的建议是什么。
谢谢
答案 0 :(得分:95)
对于记录,spring.jpa.hibernate.ddl-auto
属性是特定于Spring Data JPA的,并且是指定最终将在其知道的属性hibernate.hbm2ddl.auto
下传递给Hibernate的值的方式。
值create
,create-drop
,validate
和update
基本上会影响架构工具管理在启动时如何操作数据库架构。
例如,update
操作将查询JDBC驱动程序的API以获取数据库元数据,然后Hibernate会根据读取的带注释的类或HBM XML映射来比较它创建的对象模型,并将尝试即时调整架构。
update
操作将尝试添加新列,约束等,但永远不会删除先前可能已存在但不再作为先前运行的对象模型的一部分的列或约束。
通常在测试用例场景中,您可能会使用create-drop
以便创建架构,测试用例添加一些模拟数据,运行测试,然后在测试用例清理期间,删除模式对象,留下空数据库。
在开发过程中,通常会看到开发人员使用update
自动修改架构以在重新启动时添加新添加项。但是再次理解,这并不会删除不再需要的先前执行中可能存在的列或约束。
在制作中,我们强烈建议您使用none
或者只是不指定此属性。这是因为DBA通常会查看迁移脚本以查找数据库更改,特别是如果您的数据库是跨多个服务和应用程序共享的。
答案 1 :(得分:9)
在 Spring/Spring-Boot 中,SQL 数据库可以根据您的堆栈以不同的方式进行初始化。
JPA 具有 DDL 生成功能,这些功能可以设置为在启动时针对数据库运行。这是通过两个外部属性控制的:
spring.jpa.generate-ddl
(布尔值)打开和关闭该功能,并且与供应商无关。spring.jpa.hibernate.ddl-auto
(enum) 是一个 Hibernate 特性,它以更细粒度的方式控制行为。详情见下文。Hibernate 属性值是:create、update、create-drop、validate 和 none:
如果没有检测到模式管理器,Spring Boot 内部默认这个参数值为 create-drop,否则在所有其他情况下都没有。