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
之类的查询方法,但我认为这是一个单独的问题)