如何在连接列中指定外键?

par*_*hah 5 java spring hibernate jpa spring-boot

我的代码如下。我正在使用带有jpa和postgresql数据库的spring boot,我需要用户友好的名称作为外键。

    @实体
    @Table(name =“ course_table”)
    公共课程课程扩展了BaseAuditingEntity {

    @ManyToMany(级联= CascadeType.REMOVE,提取= FetchType.EAGER)
    @JoinTable(name =“ course_program_table”,joinColumns = @JoinColumn(name =“ course_id”,referencedColumnName =“ course_id”,foreignKey = @ForeignKey(name =“ fk_program_id”)),inverseJoinColumns = @JoinColumn(name =“ program_id”, referencedColumnName =“ program_id”,foreignKey = @ForeignKey(name =“ fk_course_id”)))
    私人名单计划;
    }

我已经使用@ForeignKey批注指定了外键的名称,但是当我看到db时,它显示了随机创建的外键名称。

创建表course_program_table
(
    course_id整数NOT NULL,
    program_id整数NOT NULL,
    约束fk_28c95hl4nqclyvyxuduei5nbf外键(program_id)
        参考public.program_table(program_id)匹配简单
        无需更新时
        删除任何操作后,
    约束fk_5sainywquv8yyu24pjk3jptn7外键(course_id)
        参考public.course_table(course_id)匹配简单
        无需更新时
        不删除任何动作
)

我需要注释中提到的外键,例如fk_program_id和fk_course_id。

提前致谢。

小智 5

对于连接表,您应该这样指定它

@ManyToMany
@JoinTable(name = "course_program_table", 
    joinColumns = @JoinColumn(name = "course_id", ...)
    foreignKey = @ForeignKey(name = "fk_program_id"), 
    inverseJoinColumns = @JoinColumn(name = "program_id", ...)
    inverseForeignKey = @ForeignKey(name = "fk_course_id"))
private List programs;
Run Code Online (Sandbox Code Playgroud)

这就是我使用我使用的 JPA 提供程序(不是 Hibernate)执行此操作的方式,这就是为什么具有@JoinTable“foreignKey”/“inverseForeignKey”属性(FK 在连接表上/由连接表拥有)。

如果这不起作用,那么您需要考虑在您选择的 JPA 提供商上提出错误。


par*_*hah 4

@ManyToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
@JoinTable(name = "tten_courseservice_course_program_table", joinColumns = @JoinColumn(name = "course_id", referencedColumnName = "course_id"), inverseJoinColumns = @JoinColumn(name = "program_id", referencedColumnName = "program_id"))
@ForeignKey(name="fk_tten_courseservice_course_table_course_id",inverseName="fk_tten_courseservice_program_table_program_id")
private List<ProgramEntity> programs;``
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了,现在我可以正确生成外键名称。

希望它能帮助其他人。