如何让hibernate一次将实体数据保存到所有相关表中?
How to make hibernate to save entity data to all related tables at once?
我使用额外的 table team_member
在 Team
和 TeamMember
之间建立了多对多关系。 Hibernate 仅将数据保存到 member
table 而忽略 team_member
。如何让它发挥作用?
DAOImpl
public void addTeamMember(TeamMember teamMember) {
getCurrentSession().save(teamMember);
}
子实体
@Entity
@Table(name="member")
public class TeamMember {
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "teamMembers", cascade = CascadeType.ALL)
public Set<Team> getTeams() {
return teams;
}
public void setTeams(Set<Team> teams) {
this.teams = teams;
}
}
父实体
@Entity
@Table(name="teams")
public class Team {
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "team_member", joinColumns =
@JoinColumn(name = "FK_Team_id", referencedColumnName= "id"),
inverseJoinColumns = @JoinColumn(name = "FK_Member_id", referencedColumnName = "id")
)
public Set<TeamMember> getTeamMembers() {
return teamMembers;
}
public void setTeamMembers(Set<TeamMember> teamMembers) {
this.teamMembers = teamMembers;
}
}
当您在 TeamMember 上写 mappedby 时,您对 JPA 说,Team 将负责管理这种关系。这意味着您必须手动将成员添加到团队列表中才能让它生效(cascadeType 都确保它)。
TeamMember member = new TeamMember()...
EM.getTransactio().beging(); //if manage transactions manually
Team team = EM.find(Team.class,id);
team.getTeamMembers().add(member);
EM.getTransaction().commit();
我使用额外的 table team_member
在 Team
和 TeamMember
之间建立了多对多关系。 Hibernate 仅将数据保存到 member
table 而忽略 team_member
。如何让它发挥作用?
DAOImpl
public void addTeamMember(TeamMember teamMember) {
getCurrentSession().save(teamMember);
}
子实体
@Entity
@Table(name="member")
public class TeamMember {
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "teamMembers", cascade = CascadeType.ALL)
public Set<Team> getTeams() {
return teams;
}
public void setTeams(Set<Team> teams) {
this.teams = teams;
}
}
父实体
@Entity
@Table(name="teams")
public class Team {
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "team_member", joinColumns =
@JoinColumn(name = "FK_Team_id", referencedColumnName= "id"),
inverseJoinColumns = @JoinColumn(name = "FK_Member_id", referencedColumnName = "id")
)
public Set<TeamMember> getTeamMembers() {
return teamMembers;
}
public void setTeamMembers(Set<TeamMember> teamMembers) {
this.teamMembers = teamMembers;
}
}
当您在 TeamMember 上写 mappedby 时,您对 JPA 说,Team 将负责管理这种关系。这意味着您必须手动将成员添加到团队列表中才能让它生效(cascadeType 都确保它)。
TeamMember member = new TeamMember()...
EM.getTransactio().beging(); //if manage transactions manually
Team team = EM.find(Team.class,id);
team.getTeamMembers().add(member);
EM.getTransaction().commit();