【问题标题】:Problem while creating multiple foreign keys on a compound primary key using JPA使用 JPA 在复合主键上创建多个外键时出现问题
【发布时间】:2020-07-05 22:06:56
【问题描述】:

我有一个这样的表结构:

Table Structure

依赖是单向的。

我的 POJO 类如下所示:

class T1 {

@EmbeddedId T1PK t1Pk;

String c13;
// getter setter
}

@Embeddable
class T1PK {

String c11;
String c12;

// getter setters hashCode equals
}

class T3 {
@Id String T31
String T32

// getter setter
}

@Embeddable
class T2PK {

T1PK t1Pk;
String c31;

// getter setters hashCode equals
}

class T2 {

@EmbeddedId T2PK t2Pk;

@MapsId("c31")
@JoinColumn(name = "c31", referencedColumnName = "c31", foreignKey = @ForeignKey(name = "FK_32"))
@OneToOne
private T3 t3;

@MapsId("t1Pk")
@JoinColumns(foreignKey = @ForeignKey(name = "FK_12"), value = {
            @JoinColumn(name = "c11", referencedColumnName = "c11"),
            @JoinColumn(name = "c12", referencedColumnName = "c12") })
@OneToOne
private T1 t1;

// getter setter

}

当我启动我的 spring boot 应用程序时,遇到以下错误

Foreign key (FKakdpaxm8kl8mv0ld210dg7mcw:t2 [c11,c12,c31])) must have same number of columns as the referenced primary key (t3 [t31])

但是,如果我只是注释掉任何一个表 t3 或 t1 的依赖关系,它就可以正常工作。将创建具有提到的 FK 名称的正确外键。

【问题讨论】:

    标签: mysql spring-boot jpa spring-data-jpa


    【解决方案1】:

    我无法尝试此操作,但 T2PK 不应包含对 T1PK 的引用,而是当前放置在 T2 中的 @OneToOneT1 的关系。

    @Embeddable
    class T2PK {
    
        @JoinColumns(foreignKey = @ForeignKey(name = "FK_12"), value = {
            @JoinColumn(name = "c11", referencedColumnName = "c11"),
            @JoinColumn(name = "c12", referencedColumnName = "c12") })
        @OneToOne
        private T1 t1;
    
        String c31;
    }
    
    class T2 {
    
        @EmbeddedId
        T2PK t2Pk;
    
        @MapsId("c31")
        @JoinColumn(name = "c31", referencedColumnName = "c31", foreignKey = @ForeignKey(name = "FK_32"))
        @OneToOne
        private T3 t3;
    }
    

    编辑:您也可以将@OneToOneT1 放入T2 并使用不带值的@MapsId@MapsId("t1") 将整个T1 对象映射到您的@ 987654334@但我不确定。

    【讨论】:

    • 不走运@Smutje,我按照你的建议尝试了,但我遇到了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多