次のように、注釈を使用して多対多の関係によってマッピングされた 2 つのエンティティ 'Person' と 'Team' があります。
@Entity
public class Perosn implements Serializable {
....
private Collection<Team> teams;
....
@ManyToMany(fetch = FetchType.LAZY)
@Cascade({CascadeType.ALL})
@JoinTable(name = "person_team",
joinColumns = { @JoinColumn(name = "person_id")},
inverseJoinColumns = {@JoinColumn(name = "team_id")})
public Collection<Team> getTeams() {
return advisers;
}
}
@Entity
public class Team implements Serializable {
....
private Collection<Person> persons;
....
@ManyToMany(fetch = FetchType.LAZY)
@Cascade({CascadeType.ALL})
@JoinTable(name = "person_team",
joinColumns = { @JoinColumn(name = "team_id")},
inverseJoinColumns = {@JoinColumn(name = "person_id")})
public Collection<Person> getPersons() {
return advisers;
}
}
次のサービス クラスを使用して、新しいチームを個人オブジェクトに追加し、結合テーブルを更新します (personId と teamId を含む新しいレコードを追加します)。
@Service("teamService")
public class TeamService extends DataAccess {
....
public void addTeamToPerson(String teamId, String personId) {
Team team= getTeam(teamId);
Person person= personService.getPerson(personId);
person.getTeams().add(team);
super.update(team);
}
....
}
public abstract class DataAccess<E> {
private EntityManager manager;
....
public void update(E object) {
try {
manager.getTransaction().begin();
manager.merge(object);
manager.getTransaction().commit();
} catch (Exception e) {
....
}
}
....
}
この構造は確かに機能しますが、個人オブジェクトのチーム コレクションにチーム オブジェクトを追加し、チーム オブジェクトを更新するのはおかしいと思います。論理的に間違っていませんか?このタイプの関係には、マスタースレーブ機能またはそのようなものがあることを知る必要があります。
どんなガイドも考慮されます。