spring 即使实体没有改变,Hibernate也会改变表

vkc1a9a2  于 2023-09-29  发布在  Spring
关注(0)|答案(1)|浏览(132)

我正在做一个Sping Boot 项目,它使用Hibernate进行ORM,在我的application.properties中,我将spring.jpa.hibernate.ddl-auto设置为update
当我的实体类发生变化时,这个设置便于更新数据库模式。
然而,我注意到Hibernate为所有列生成ALTER语句,包括那些在我的实体类中没有改变的列。这导致应用程序启动较慢,因为它不必要地更改了每个表。
下面是我收到的一个示例输出:

Hibernate: 
    alter table document_comments 
       modify column created_at  datetime(6)
Hibernate: 
    alter table documents 
       modify column content  json
Hibernate: 
    alter table documents 
       modify column created_at  datetime(6)
Hibernate: 
    alter table documents 
       modify column status  enum ('ACTIVE','ARCHIVED','DELETED')
Hibernate: 
    alter table documents 
       modify column updated_at  datetime(6)

这样的例子不胜枚举。
我正在使用Java 17、Spring 3.1.2和Hibernate 2.6

n9vozmp4

n9vozmp41#

如果一个列必须改变是hibernate自己的决定。
Hibernate从JDBC驱动程序读取类型,并将此类型与实体中的类型进行比较。如果Hibernate识别出差异,那么Hibernate会尝试使用alter-table DDL update-commands来解决这个差异。Hibernate可能无法成功更新类型(因为类型已设置)。
hibernate认为更改可能会有所帮助的原因有三个:

  1. jdbc-driver报告的database-type的值范围与java-field-type的值范围不同。
  2. jdbc-driver报告错误的值(可能是jdbc-driver中的错误)。
  3. sql数据库的方言与jdbc驱动程序不匹配。
    触发器问题可能是hibernate中的一个bug,如果类型从一种类型更改为另一种类型,就会发生这种情况。
    您可以尝试:
    1.尝试使用最新的jdbc驱动程序。
    1.试着纠正 hibernate 方言。
    1.尝试使用更匹配的entity-field-type。
    1.尝试使用最新的hibernate版本(相应的 transient 依赖项)。
    从建筑师的Angular 来看:
    有一个原则叫做单一版本的真理(SVOT)。它指出,DB要么持有数据结构的100%真实性,要么持有实体。这可能给予提示DB在字段类型保存方面总是正确的。这将指导您修改实体,直到它与DB完全匹配。

相关问题