这个应用程序的栈:Spring MVC,Spring DataJPA,Hibernate。有三个实体:student、tutor、theme。
主题
@Entity
@Table(name = "themes")
public class Theme {
// fields omitted
}学生
@Entity
@Table(name = "students")
public class Student {
private Map<Theme, Tutor> tutors;
// other fields omitted
}Tutor
@Entity
@Table(name = "tutors")
public class Tutor {
private Map<Theme, Student> students;
// other fields omitted
}为了保存student-tutor-theme关系,我希望使用这个表(PostgreSQL)
CREATE TABLE themes_students_tutors
(
theme_id INTEGER NOT NULL,
student_id INTEGER NOT NULL,
tutor_id INTEGER NOT NULL,
FOREIGN KEY (theme_id) REFERENCES themes (id) ON DELETE CASCADE,
FOREIGN KEY (student_id) REFERENCES students (id) ON DELETE CASCADE,
FOREIGN KEY (tutor_id) REFERENCES tutors (id) ON DELETE CASCADE
)如何对实体中的tutors和students字段进行注释,因为它们的内容正确存在于此表中?
发布于 2021-02-14 18:08:32
正如提到的@kolossus :使用@MapKeyJoinColumn1 1注释,使类(或映射字段)看起来如下(您可以忽略AbstractPersistable的扩展):
学生:
public class Student extends AbstractPersistable<Long> {
@ManyToMany
@JoinTable(name = "themes_students_tutors", joinColumns = {
@JoinColumn(name = "student_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "tutor_id", referencedColumnName = "id") })
@MapKeyJoinColumn(name = "theme_id")
private Map<Theme, Tutor> tutors;
}导师:
public class Tutor extends AbstractPersistable<Long> {
@ManyToMany
@JoinTable(name = "themes_students_tutors", joinColumns = {
@JoinColumn(name = "tutor_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "student_id", referencedColumnName = "id") })
@MapKeyJoinColumn(name = "theme_id")
private Map<Theme, Student> students;
}既然如此,这样的东西就会被创造出来:
Hibernate: create table students (id bigint not null, primary key (id))
Hibernate: create table themes (id bigint not null, primary key (id))
Hibernate: create table themes_students_tutors (tutor_id bigint not null, student_id bigint not null, theme_id bigint not null, primary key (student_id, theme_id))
Hibernate: create table tutors (id bigint not null, primary key (id))
Hibernate: alter table themes_students_tutors add constraint FKm5l4is34t5gs14p4skkv3aup7 foreign key (student_id) references students
Hibernate: alter table themes_students_tutors add constraint FK8o0mm5ywi0l4hdxi4lgw4dbnu foreign key (theme_id) references themes
Hibernate: alter table themes_students_tutors add constraint FKa0n6jvie0kmk0pmikcuvtepxh foreign key (tutor_id) references tutors1:参见Javadoc documentation of @MapKeyJoinColumn中的其他一些样本
https://stackoverflow.com/questions/66197034
复制相似问题