我有这两个实体:
@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。我已经尝试了很多方法,但到目前为止没有一个有效。实现这种多对多关系的正确且有效的形式是怎样的?
在 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 实体中相应的外键列。
这种方法允许您使用组合键有效管理多对多关系。