自定义@ForeignKey 注释的休眠 DLL 验证似乎失败了?

问题描述

我遇到了 Hibernate 针对 Flyway 初始迁移脚本验证架构的问题。

出现问题的实体:


@Entity
@ToString
@Getter
@Setter
@EqualsAndHashCode
@Table(name = "agent_descriptions")
public class AgentDescriptions {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "short_description",length = 512)
    private String shortDescription;

    @Column(name = "long_description",length = 2048)
    private String longDescription;

    @ManyToOne(optional = false,fetch = FetchType.LAZY)
    @JoinColumn(foreignKey = @ForeignKey(name = "fk_agent_id",value = ConstraintMode.CONSTRAINT))
    private Agent agent;
}

Flyway 脚本似乎运行良好并创建了下表(来自 org.flywaydb 的调试日志)。 sql 旨在设置与 @JoinTable @ForeignKey 同名的外键,但验证器似乎尝试使用 Hibernate 认值 entity_id 作为外键名称


create TABLE `agent_descriptions` (
    `id` bigint NOT NULL AUTO_INCREMENT,`short_description` varchar(512) NOT NULL,`long_description` varchar(2048) NOT NULL,`fk_agent_id` BIGINT NOT NULL,CONSTRAINT `FK_Agent_Description_To_Agent` FOREIGN KEY (`fk_agent_id`) REFERENCES `agents` (`id`),KEY `FK_Agent_ID` (`fk_agent_id`),PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

我在启动时从 Hibernate 模式验证器得到的错误是:

 Schema-validation: missing column [agent_id] in table [agent_descriptions]

我猜我需要做一些事情才能让验证器使用 JPA 注释 @JoinTable(foreignKey=@ForeignKey(name="fk_agent_id")) 进行外键验证,还是这是 DLL validate 架构选项的限制?

感谢您的帮助。

解决方法

foreignKey 定义外键约束的名称,而不是列的名称。

如果您的列使用 Hibernate ORM 的默认值,则它仍命名为 agent_id,因此您的 Flyway 脚本需要以这种方式修复:

`agent_id` BIGINT NOT NULL,