问题描述
我遇到了 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,