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 注释似乎失败了?的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot整合Hibernate自定义数据验证及多种方式异常处理
Sitecore 8.0(构建 3)MVC WFFM 自定义验证器不工作