如何在 JPA 中仅使用一个匹配列在具有不同 EmbeddedId 对象的两个类之间建立多对一关系?

问题描述 投票:0回答:1

我在 JPA 中有两个实体,class1 和 class2,具有以下结构:

// class1
@Embeddable
public class Class1Id {
    @Column(name = "col_one")
    String column1;
    
    @Column(name = "col_two")
    String column2;
}

@Entity
public class Class1 {
    @EmbeddedId
    Class1Id class1Id;

    @OneToMany(mappedBy = "class1")
    List<Class2> class2List;
}
// class2
@Embeddable
public class Class2Id {
    @Column(name = "col_one")
    String column1;
    
    @Column(name = "col_three")
    Integer column3;
}

@Entity
public class Class2 {
    @EmbeddedId
    Class2Id class2Id;

    @ManytoOne
    @JoinColumn(name = "col_one", referencedColumnName = "col_one")
    Class1 class1;
}

我想在class1和class2之间创建多对一关系,但只使用column1(即col_one),这在class1和class2中都很常见。

有没有办法仅使用 column1 链接 JPA 中的这两个类,即使它们具有不同的 EmbeddedId 结构?如何正确映射这种关系?

java jpa embeddable
1个回答
0
投票

当然,您可以仅使用

Class1
字段在
Class2
column1
之间建立多对一关系,即使它们具有不同的 EmbeddedId 结构。您需要使用
@MapsId
注释来正确映射关系。请按照以下步骤操作:

  • 修改
    Class2
    以使用
    @MapsId
    将 column1 字段映射到
    Class1
    实体。
  • 确保
    Class2Id
    类具有与
    column1
    中的
    column1
    匹配的
    Class1Id
    字段。
// Class1Id
@Embeddable
public class Class1Id {
    @Column(name = "col_one")
    String column1;
    
    @Column(name = "col_two")
    String column2;
}
// Class1
@Entity
public class Class1 {
    @EmbeddedId
    Class1Id class1Id;

    @OneToMany(mappedBy = "class1")
    List<Class2> class2List;
}
// Class2Id
@Embeddable
public class Class2Id {
    @Column(name = "col_one")
    String column1;
    
    @Column(name = "col_three")
    Integer column3;
}
// Class2
@Entity
public class Class2 {
    @EmbeddedId
    Class2Id class2Id;

    @MapsId("column1")
    @ManyToOne
    @JoinColumn(name = "col_one", referencedColumnName = "col_one")
    Class1 class1;
}

Class2
中,
@MapsId("column1")
注释告诉JPA应该使用Class2Id中的column1字段将关系映射到
Class1
@JoinColumn(name = "col_one", referencedColumnName = "col_one")
注释指定
Class2
中的 col_one 列应用于与
Class1
中的 col_one 列连接。

© www.soinside.com 2019 - 2024. All rights reserved.