我正在做一个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
1条答案
按热度按时间n9vozmp41#
如果一个列必须改变是hibernate自己的决定。
Hibernate从JDBC驱动程序读取类型,并将此类型与实体中的类型进行比较。如果Hibernate识别出差异,那么Hibernate会尝试使用alter-table DDL update-commands来解决这个差异。Hibernate可能无法成功更新类型(因为类型已设置)。
hibernate认为更改可能会有所帮助的原因有三个:
触发器问题可能是hibernate中的一个bug,如果类型从一种类型更改为另一种类型,就会发生这种情况。
您可以尝试:
1.尝试使用最新的jdbc驱动程序。
1.试着纠正 hibernate 方言。
1.尝试使用更匹配的entity-field-type。
1.尝试使用最新的hibernate版本(相应的 transient 依赖项)。
从建筑师的Angular 来看:
有一个原则叫做单一版本的真理(SVOT)。它指出,DB要么持有数据结构的100%真实性,要么持有实体。这可能给予提示DB在字段类型保存方面总是正确的。这将指导您修改实体,直到它与DB完全匹配。