如何使用连接列指定外键?

Posted

技术标签:

【中文标题】如何使用连接列指定外键?【英文标题】:How to specify foreign key with the join column? 【发布时间】:2018-09-08 11:12:59 【问题描述】:

我的代码如下。我正在使用带有 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) MATCH SIMPLE 更新无动作 在不删除任何操作时, 约束 fk_5sainywquv8yyu24pjk3jptn7 外键(course_id) 参考 public.course_table (course_id) MATCH SIMPLE 更新无动作 删除无操作 )

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

提前致谢。

【问题讨论】:

hibernate 是否生成了该表?您甚至不需要在代码中指定 FK。这纯粹是可选的 是的,Hibernate 正在生成表,但我希望 FK 的名称如注释中所述。 查看此链接。可能与***.com/questions/16564789/… 重复 您是否尝试过明确指定@ForeignKey 而不是将其嵌套在其他注释中? 是的,我已经尝试过该解决方案,但它不起作用。 【参考方案1】:

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

@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;

这就是我使用我使用的 JPA 提供程序(不是 Hibernate)的方式,这就是为什么 @JoinTable 具有“foreignKey”/“inverseForeignKey”属性(FK 由连接表打开/拥有) .

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

【讨论】:

我试过这个......它没有给出任何错误,但它在数据库中创建了随机生成的外键。 所以你需要在你正在使用的 jpa 提供者上提出一个错误 与 Quarkus Hibernate 1.13.7 一起正常工作。接受的答案对我不起作用,因为@javax.persistence.ForeignKey 中没有inverseName【参考方案2】:
@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;``

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

希望对其他人有所帮助。

【讨论】:

以上是关于如何使用连接列指定外键?的主要内容,如果未能解决你的问题,请参考以下文章

如何两次引用外键表?

如何使用 LINQ 中的外键列检索单个记录?

如何使用 CodeIgniter 3 中的外键从表中获取列数据

SqlServer2008 如何判断一张表的数据不在另外两张表里且在该表中新建一列显示状态

如何确定哪些列用作外键?

如何在 EF.core 中使用 FromSqlRaw 指定列