Java 如何注释地图<;实体,实体>;和JPA一起?

Java 如何注释地图<;实体,实体>;和JPA一起?,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,应用程序堆栈:springmvc,springdatajpa,Hibernate。有三个实体:学生,导师,主题 主题: @Entity @Table(name = "themes") public class Theme { // fields omitted } @Entity @Table(name = "students") public class Student { private Map<Theme, Tutor>

应用程序堆栈:
springmvc
springdatajpa
Hibernate
。有三个实体:
学生
导师
主题

主题

@Entity
@Table(name = "themes")
public class Theme {
    // fields omitted
}
@Entity
@Table(name = "students")
public class Student {

    private Map<Theme, Tutor> tutors;
    // other fields omitted
}
@Entity
@Table(name = "tutors")
public class Tutor {

    private Map<Theme, Student> students;
    // other fields omitted
}
学生

@Entity
@Table(name = "themes")
public class Theme {
    // fields omitted
}
@Entity
@Table(name = "students")
public class Student {

    private Map<Theme, Tutor> tutors;
    // other fields omitted
}
@Entity
@Table(name = "tutors")
public class Tutor {

    private Map<Theme, Student> students;
    // other fields omitted
}

我如何在实体中注释
导师
学生
字段,因为他们的内容正确保存在该表中?

如@kolossus所述:使用
@MapKeyJoinColumn
注释,使类(或映射字段)看起来像这样(您可以忽略
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;

}


⑨:有关其他一些示例

@MapKeyColumn
@ManyToMany
?请尝试使用@dan1st-oh,也许吧。但我不知道,我该如何使用它。我了解一般原理,但我对这些注释在我的案例中的具体应用感兴趣。我不知道这个,很高兴知道。但无论如何,我会将联接表映射为实体,因为我发现以后当您必须为报表编写一些查询代码时,这会更容易。@DelfinoGomes如果它仍然是一个简单的联接表而没有附加信息,我认为不将其映射到实体就可以了。但是如果一些信息起作用(比如附加的列,比如“开始/结束日期”),我也认为将表映射到实体会更好(或者是唯一的可能性)。(关于查询的好观点:我不知道是否/如何使用Spring数据功能,例如
findByXY
之类的查询方法,但我认为这是一个单独的问题)