我在我的Spring启动应用程序项目中工作,并注意到,有时会有一个连接超时错误到另一个服务器(SQL server)上的数据库。 这种情况特别发生在我尝试用FlyWay做一些脚本迁移时,但它在几次尝试后都能工作。

然后我注意到我没有在属性文件中指定spring.jpa.hibernate.ddl-auto。我做了一些研究,发现建议添加 Spring.jpa.hibernate.ddl-auto =在开发中创建-drop。 在生产环境中将其更改为:spring.jpa.hibernate.ddl-auto= none。

但我实际上不明白它是如何工作的,以及hibernate如何使用create-drop或none value生成数据库模式。您能否从技术上解释一下它是如何工作的,以及在开发和生产服务器上使用此属性的建议是什么? 谢谢你!


当前回答

对于JPA/Hibernate的属性 Spring.jpa.hibernate.ddl-auto的值应该是create, update, create-drop,而不是其他,否则它会给出一个异常,其中这些值的正确含义是-

Create : when the server will start all entity will be newly created Update : when the server will start container will find which entities are update and which all are newly created the same thing will happen inside database as well old table will update as per the entity and newly table will created Create-drop: when the server will start then auto all entity will crete and when the server will stop all the entities will auto remove from database none : it means database ddl will not impact from back-end application Note: Production environment always set with none value

其他回答

对于JPA/Hibernate的属性 Spring.jpa.hibernate.ddl-auto的值应该是create, update, create-drop,而不是其他,否则它会给出一个异常,其中这些值的正确含义是-

Create : when the server will start all entity will be newly created Update : when the server will start container will find which entities are update and which all are newly created the same thing will happen inside database as well old table will update as per the entity and newly table will created Create-drop: when the server will start then auto all entity will crete and when the server will stop all the entities will auto remove from database none : it means database ddl will not impact from back-end application Note: Production environment always set with none value

"spring.jpa.hibernate.ddl-auto= create-drop"意味着当服务器运行时,数据库(表)实例被创建。只要服务器停止,数据库表实例就会被删除。

在Spring/Spring- boot中,SQL数据库可以以不同的方式初始化,这取决于您的堆栈是什么。

JPA具有用于DDL生成的特性,这些特性可以设置为在启动时针对数据库运行。这是通过两个外部属性控制的:

generate-ddl(布尔值)开启和关闭该特性,并且与供应商无关。 ddl-auto (enum)是Hibernate的一个特性,它以更细粒度的方式控制行为。详情见下文。

Hibernate属性值为:create, update, create-drop, validate和none:

create – Hibernate first drops existing tables, then creates new tables update – the object model created based on the mappings (annotations or XML) is compared with the existing schema, and then Hibernate updates the schema according to the diff. It never deletes the existing tables or columns even if they are no more required by the application create-drop – similar to create, with the addition that Hibernate will drop the database after all operations are completed. Typically used for unit testing validate – Hibernate only validates whether the tables and columns exist, otherwise it throws an exception none – this value effectively turns off the DDL generation

在Spring Boot内部,如果没有检测到模式管理器,该参数值默认为create-drop,否则所有其他情况都不设置。

需要说明的是,Spring . JPA . Hibernate .ddl-auto属性是Spring Data JPA特定的,是他们指定值的方式,该值最终将在Hibernate所知道的属性Hibernate .hbm2ddl.auto下传递给Hibernate。

创建、创建-删除、验证和更新的值基本上会影响模式工具管理在启动时如何操作数据库模式。

例如,更新操作将查询JDBC驱动程序的API以获得数据库元数据,然后Hibernate比较它基于读取带注释的类或HBM XML映射创建的对象模型,并尝试动态调整模式。

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

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

在开发过程中,经常可以看到开发人员使用update自动修改模式,以便在重新启动时添加新的内容。但是请再次理解,这并没有删除以前执行中可能存在的不再需要的列或约束。

在生产环境中,通常强烈建议不使用这个属性,或者干脆不指定这个属性。这是因为对于dba来说,检查迁移脚本以更改数据库是一种常见的做法,特别是如果您的数据库是跨多个服务和应用程序共享的。