jpa. hib. dld-auto属性在Spring中究竟是如何工作的?

kfgdxczn  于 2023-01-26  发布在  Spring
关注(0)|答案(4)|浏览(133)

我正在做我的Sping Boot 应用程序项目,注意到有时候我的数据库在另一个服务器(SQL Server)上会出现连接超时错误。当我尝试使用FlyWay进行一些脚本迁移时,这种情况会特别发生,但经过几次尝试后,它仍然有效。
然后我注意到我没有在我的属性文件中指定spring.jpa.hibernate.ddl-auto,我做了一些研究,发现建议在开发中添加spring.jpa.hibernate.ddl-auto= create-drop,并将其更改为:生产中的spring.jpa.hibernate.ddl-auto= none
但是我实际上并不了解它是如何工作的,以及Hibernate是如何使用create-dropnone值生成数据库模式的。您能从技术上解释一下它是如何工作的吗?以及在开发和生产服务器上使用这个属性的建议是什么?谢谢

osh3o9ms

osh3o9ms1#

需要说明的是,spring.jpa.hibernate.ddl-auto属性是Spring Data JPA特定的,并且是他们指定一个值的方式,该值最终将在Hibernate已知的属性hibernate.hbm2ddl.auto下传递给Hibernate。
createcreate-dropvalidateupdate基本上影响模式工具管理在启动时如何操作数据库模式。
例如,update操作将查询JDBC驱动程序的API以获取数据库元数据,然后Hibernate比较它基于阅读带注解的类或HBM XMLMap创建的对象模型,并尝试动态调整模式。
例如,update操作将尝试添加新的列、约束等,但决不移除先前可能已经存在但不再作为来自先前运行的对象模型的一部分的列或约束。
通常在测试用例场景中,您可能会使用create-drop来创建模式,测试用例添加一些模拟数据,运行测试,然后在测试用例清理期间,删除模式对象,留下一个空数据库。
在开发过程中,经常会看到开发人员使用update自动修改模式,以便在重新启动时添加新的内容,但请再次理解,这并不会删除先前执行中可能存在的不再需要的列或约束。
在生产环境中,通常强烈建议您使用none或干脆不指定此属性,因为DBA通常会检查迁移脚本以查看数据库更改,特别是在多个服务和应用程序共享数据库时。

polkgigr

polkgigr2#

在Spring/Spring-Boot中,SQL数据库可以根据您的堆栈以不同的方式初始化。
JPA具有生成DDL的特性,这些特性可以设置为在数据库启动时运行。这是通过两个外部属性控制的:

  • spring.jpa.generate-ddl(boolean)打开和关闭该功能,并且独立于供应商。
  • spring.jpa.hibernate.ddl-auto(enum)是一个Hibernate特性,它以更细粒度的方式控制行为。

Hibernate属性值为:创建、更新、创建-删除、验证和无:

  • create - Hibernate首先删除现有表,然后创建新表
  • update --将基于Map(注解或XML)创建的对象模型与现有模式进行比较,然后Hibernate根据比较结果更新模式。它从不删除现有的表或列,即使应用程序不再需要它们
  • create-drop -类似于create,但Hibernate会在所有操作完成后删除数据库。
  • validate - Hibernate只验证表和列是否存在,否则抛出异常
  • none -此值有效地关闭DDL生成

如果没有检测到模式管理器,Sping Boot 在内部将此参数值默认为create-drop,否则在所有其他情况下不默认。

vktxenjb

vktxenjb3#

“spring.jpa. hib.ddl-auto= create-drop”表示当服务器运行时,数据库(表)示例被创建,而每当服务器停止时,数据库表示例被丢弃。

vsaztqbk

vsaztqbk4#

对于JPA/Hibernate的属性spring. jpa. hib. dld-auto,值应为create、update、create-drop,而不是其他值,则会出现异常,其中这些值的正确含义-

      • 创建**:当服务器启动时,所有实体都将被新建
      • 更新**:当服务器启动时,容器将发现哪些实体被更新,哪些都是新创建的,同样的事情将发生在数据库内部,旧表将根据实体更新,新表将创建
      • 创建-删除**:当服务器将启动然后自动所有实体将crete和当服务器将停止所有实体将自动从数据库中删除
      • none**:表示数据库ddl不会受到后端应用程序的影响:生产环境始终设置为无值

相关问题