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

Posted

技术标签:

【中文标题】Hibernate DLL 验证自定义 @ForeignKey 注释似乎失败了?【英文标题】:Hibernate DLL validate for custom @ForeignKey annotation seems to fail? 【发布时间】:2021-04-20 10:36:44 【问题描述】:

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 架构选项的限制?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

`agent_id` BIGINT NOT NULL,

【讨论】:

谢谢。这很有帮助。我做了一些挖掘(查看源代码),只是忽略了你可以在@JoinColumn 中设置 cloumn 名称......如果你只是添加,你可以添加 @JoinColumn(name="fk_agent_id", foreignKey=@ForeignKey(name= "FK_foreignKeyName") 我可以验证你的答案:)

以上是关于Hibernate DLL 验证自定义 @ForeignKey 注释似乎失败了?的主要内容,如果未能解决你的问题,请参考以下文章

自定义hibernate后端参数验证注解

SpringBoot整合Hibernate自定义数据验证及多种方式异常处理

Sitecore 8.0(构建 3)MVC WFFM 自定义验证器不工作

hibernate validator.validateproperty一次可以验证多个属性吗

写自定义参数验证方式

如何在 Hibernate 中为某些实体禁用模式验证?