JPA Spring Java 中具有组合键的多对多

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

我有这两个实体:

@Entity
public class A implements Serializable{
 
 @Id
 @Column(name = "idA")
 String idA;

 @Column(name = "idB")
 String idB;


//Getters, setters, equals, hash...

}


@Entity
@IdClass(BPK.class)
public class B implements Serializable{
 
 @Id
 @Column(name = "idB")
 String idB;

 @Id
 @Column(name = "idB2")
 String idB2;

 @Id
 @Column(name = "idB3")
 String idB3;

 @Id
 @Column(name = "idB4")
 String idB4;


//Getters, setters, equals, hash...

}

我试图以多种方式实现这两个实体之间的多对多关系,但我尝试过的每件事都出现了错误。

我想做这样的事情:

@Entity
public class A implements Serializable{
 
 @Id
 @Column(name = "idA")
 String idA;

 @Column(name = "idB")
 String idB;

 @ManyToMany
 JoinColumn(name = "idB", referencedColumn = "idB")
 List<B> b;


//Getters, setters, equals, hash...

}

但是这种实现这种关系的方式最终只会在我使用 getB() 时检索到 null。我已经尝试了很多方法,但到目前为止没有一个有效。实现这种多对多关系的正确且有效的形式是怎样的?

java spring hibernate jpa
1个回答
0
投票

在 JPA 中使用组合键建立多对多关系时,通常使用连接表方法,因为映射方法不直接支持组合键。以下是如何使用连接表通过组合键实现多对多关系:

使用组合键的连接表方法: 您为连接表创建一个实体,并使用复合主键来表示实体之间的关系。 复合主键由引用关联实体的主键的外键列组成。 示例:

@Entity
public class StudentCourse {
    @EmbeddedId
    private StudentCourseId id;

    // Additional attributes if needed

    @ManyToOne
    @MapsId("studentId")
    private Student student;

    @ManyToOne
    @MapsId("courseId")
    private Course course;

    // Getters and setters
}

@Embeddable
public class StudentCourseId implements Serializable {
    private Long studentId;
    private Long courseId;

    // Getters and setters, equals(), hashCode(), and constructor
}
@Entity
public class Student {
    @Id
    private Long id;
    // Other attributes

    @OneToMany(mappedBy = "student")
    private List<StudentCourse> studentCourses;
}

@Entity
public class Course {
    @Id
    private Long id;
    // Other attributes

    @OneToMany(mappedBy = "course")
    private List<StudentCourse> studentCourses;
}

在此设置中,StudentCourse 充当具有复合主键 (StudentCourseId) 的联接表实体。 @EmbeddedId注解用于指示StudentCourse的主键是复合键。 @MapsId 注解用于将复合主键列映射到 Student 和 Course 实体中相应的外键列。

这种方法允许您使用组合键有效管理多对多关系。

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