当前位置: 首页 > 知识库问答 >
问题:

spring.jpa.hibernate.ddl-auto属性在Spring中到底是如何工作的?

宗政子辰
2023-03-14

我在处理Spring boot应用程序项目时注意到,有时在另一台服务器(SQL server)上出现到数据库的连接超时错误。当我尝试使用flyway进行一些脚本迁移时,特别会发生这种情况,但尝试了几次后它仍然工作。

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

共有1个答案

臧威
2023-03-14

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

createcreate-dropvalidateupdate基本上影响架构工具管理在启动时操作数据库架构的方式。

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

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

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

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

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

 类似资料:
  • 问题内容: 我当时在从事我的Spring Boot应用程序项目,并注意到,有时到另一个服务器(SQL Server)上的数据库存在连接超时错误。当我尝试执行一些脚本迁移时,这种情况会特别发生,但在尝试几次后仍可以正常工作。 然后我注意到我没有在属性文件中指定 。我做了一些研究,发现建议增加 开发。并将其更改为:生产中。 但是我实际上并不了解它实际上是如何工作的,以及hibernate如何使用或值生

  • 我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示

  • 阅读官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html 我可以读到关于周围的建议: 围绕通知:围绕连接点的通知,如方法调用。这是最有力的忠告。围绕建议可以在方法调用之前和之后执行自定义行为。它还负责选择是继续连接点,还是通过返回自己的返回值或引发异常来快捷执行建议的方法。 但

  • 问题内容: 我正在研究Spring Core认证,我对Spring如何处理bean的生命周期,尤其是bean后处理器有疑问。 所以我有这个架构: 我很清楚这是什么意思: 在“ 装入Bean定义”阶段执行以下步骤: @Configuration类被处理和/或@Components被扫描和/或XML文件进行解析。 Bean定义已添加到BeanFactory(每个索引都在其ID下建立索引) 调用特殊的B

  • 我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者

  • 问题内容: 我一直在阅读其手册页,但尚未成功弄清其工作原理。在调用system()时,是否分叉了一个新的子进程,并在其中添加了shell二进制文件exec()?但这可能是一个愚蠢的猜测。 问题答案: 是的,system()本质上是传递的命令字符串的fork()和exec()“ sh -c”。可以在此处找到示例实现(来自eglibc,最近来自glibc)。