【问题标题】: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 的名称如注释中所述。
  • 查看此链接。可能与stackoverflow.com/questions/16564789/… 重复
  • 您是否尝试过明确指定@ForeignKey 而不是将其嵌套在其他注释中?
  • 是的,我已经尝试过该解决方案,但它不起作用。

标签: java spring hibernate spring-boot jpa


【解决方案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;``

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

希望对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多