如何使用连接列指定外键?
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;``
我已经尝试过了,现在我可以正确生成外键名了。
希望对其他人有所帮助。
【讨论】:
以上是关于如何使用连接列指定外键?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 CodeIgniter 3 中的外键从表中获取列数据