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

klsxnrf1  于 2023-10-15  发布在  Spring
关注(0)|答案(3)|浏览(152)

代码如下。我使用的是Spring的 Boot 与jpa和postgresql数据库我需要用户友好的名字作为外键。

@Entity
    @Table(name="course_table")
    public class Course extends BaseAuditingEntity {

    @ManyToMany(cascade = CascadeType.REMOVE, fetch = 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")))
    private List programs;
    }

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

CREATE TABLE course_program_table
(
    course_id integer NOT NULL,
    program_id integer NOT NULL,
    CONSTRAINT **fk_28c95hl4nqclyvyxuduei5nbf** FOREIGN KEY (program_id)
        REFERENCES public.program_table (program_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT **fk_5sainywquv8yyu24pjk3jptn7** FOREIGN KEY (course_id)
        REFERENCES public.course_table (course_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

我需要像fk_program_id和fk_course_id注解中提到的外键。
先谢了。

ffscu2ro

ffscu2ro1#

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

@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提供程序上提出一个错误。

pbwdgjma

pbwdgjma2#

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

我已经尝试过了,现在我可以正确地生成外键名称了。
希望能对其他人有所帮助。

eqzww0vc

eqzww0vc3#

所有其他的答案对我都有效,但是我必须添加额外的唯一约束,否则我可以看到在liquibase变更集中生成的额外的唯一键。
以下内容涵盖了所有的键。

@ManyToMany
    @JoinTable(name = "STUDENT_COURSE_MAPPING",
            joinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "COURSE_ID", referencedColumnName = "ID"),
            foreignKey = @ForeignKey(name="FK__STUDENT_COURSE_MAPPING__STUDENT"),
            inverseForeignKey = @ForeignKey(name="FK__STUDENT_COURSE_MAPPING__COURSE"),
            uniqueConstraints = @UniqueConstraint(name="UK__STUDENT_COURSE_MAPPING",columnNames = {"STUDENT_ID","COURSE_ID"})
    )
    private Set<Course> courses;

相关问题