我正在做我的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-drop
或none
值生成数据库模式的。您能从技术上解释一下它是如何工作的吗?以及在开发和生产服务器上使用这个属性的建议是什么?谢谢
4条答案
按热度按时间osh3o9ms1#
需要说明的是,
spring.jpa.hibernate.ddl-auto
属性是Spring Data JPA特定的,并且是他们指定一个值的方式,该值最终将在Hibernate已知的属性hibernate.hbm2ddl.auto
下传递给Hibernate。值
create
、create-drop
、validate
和update
基本上影响模式工具管理在启动时如何操作数据库模式。例如,
update
操作将查询JDBC驱动程序的API以获取数据库元数据,然后Hibernate比较它基于阅读带注解的类或HBM XMLMap创建的对象模型,并尝试动态调整模式。例如,
update
操作将尝试添加新的列、约束等,但决不移除先前可能已经存在但不再作为来自先前运行的对象模型的一部分的列或约束。通常在测试用例场景中,您可能会使用
create-drop
来创建模式,测试用例添加一些模拟数据,运行测试,然后在测试用例清理期间,删除模式对象,留下一个空数据库。在开发过程中,经常会看到开发人员使用
update
自动修改模式,以便在重新启动时添加新的内容,但请再次理解,这并不会删除先前执行中可能存在的不再需要的列或约束。在生产环境中,通常强烈建议您使用
none
或干脆不指定此属性,因为DBA通常会检查迁移脚本以查看数据库更改,特别是在多个服务和应用程序共享数据库时。polkgigr2#
在Spring/Spring-Boot中,SQL数据库可以根据您的堆栈以不同的方式初始化。
JPA具有生成DDL的特性,这些特性可以设置为在数据库启动时运行。这是通过两个外部属性控制的:
spring.jpa.generate-ddl
(boolean)打开和关闭该功能,并且独立于供应商。spring.jpa.hibernate.ddl-auto
(enum)是一个Hibernate特性,它以更细粒度的方式控制行为。Hibernate属性值为:创建、更新、创建-删除、验证和无:
如果没有检测到模式管理器,Sping Boot 在内部将此参数值默认为create-drop,否则在所有其他情况下不默认。
vktxenjb3#
“spring.jpa. hib.ddl-auto= create-drop”表示当服务器运行时,数据库(表)示例被创建,而每当服务器停止时,数据库表示例被丢弃。
vsaztqbk4#
对于JPA/Hibernate的属性spring. jpa. hib. dld-auto,值应为create、update、create-drop,而不是其他值,则会出现异常,其中这些值的正确含义-