我有一个Student
实体,一个Team
实体。然后,我创建了一个StudentTeam
实体,其中包含“student_id
”,“team_id
”和“updateTime
”字段。
Student
实体看起来像这样:
@Entity
@Table(name = "student")
public class Student {
@OneToMany(mappedBy = "student")
private Set<StudentTeam> studentTeams = new HashSet<StudentTeam>();
//Getter & Setter
}
Student
&amp; StudentTeam
有 OneToMany 关系。
Team
实体看起来像这样:
@Entity
@Table(name = "team")
public class Team {
private int tid;
private String name;
private String city;
//Getter & Setter
}
数据库中的team
表如下所示:
tid name city
___ ______ _____
1 name1 city_A
2 name1 city_B
3 name3 city_C
...
不同的团队实例可以相同 name
但不同 city
以上事情很好。
现在,我的客户向我发送了一个请求,其中包含一个学生ID,一个包含相应城市的团队名称列表。
此客户希望我更新此学生的团队(更新数据库中的student_team
表)与其发送的团队。要注意,学生可能有一个团队与同一团队name
但city
不同。此外,如果这个学生在DB中有其他团队但在请求中没有提到,那么他们应该留在这个学生。
我正在使用Servlet + Hibernate。我想知道在这种情况下更新学生团队最有效的HQL是什么?
答案 0 :(得分:0)
如果您的要求可以接受,您还可以在地图中使用Map
集合。例如:
@Entity
public class Student {
...
private String name;
@ManyToMany @JoinTable
@MapKeyColumn(name="city")
private Map<String, Team> mapTeam;
...
}
@Entity
public class Team {
...
String name
...
}
上面的映射需要三个表:student
,team
和student_team
。
您可以使用以下代码向Team
添加新的Student
:
student.getMapTeam().put('City_A', team1);
student.getMapTeam().put('City_B', team1);
student.getMapTeam().put('City_C', team2);
您只需要查询Student
实体。然后,您可以通过调用Team
来检索所有getMapTeam()
及其关联的城市。