私は次の非常に単純な1対多の関係を持っています:
チームには選手のセットがあります:
@Entity(name = "TEAM")
@Access(AccessType.PROPERTY)
public class Team{
private Integer id;
private String name;
private Set<Player> players ;
@Id
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "team_name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade = {CascadeType.ALL},orphanRemoval=true)
@JoinColumn(name = "TEAM_ID")
public Set<Player> getPlayers() {
return players;
}
public void setPlayers(Set<Player> players) {
this.players = players;
}
}
また、各プレイヤーには固有の ID と名前があります。
@Entity(name = "PLAYER")
@Access(AccessType.PROPERTY)
public class Player implements Serializable{
private int id;
private String name;
@Id
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "player_name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
return id == ((Player)obj).id;
}
@Override
public int hashCode() {
return id;
}
}
私は非常に単純なコードを実行します:
Team team = createTeam(3) // creates team with 3 players ids={1,2,3}
session.saveOrUpdate(team);
...
private Team createTeam(int players) {
Team team = new Team();
team.setName("Bears");
team.setId(1);
for(int i=1 ; i<=players; ++ i){
Player player = new Player();
player.setId(i);
player.setName("Player"+i);
team.addPlayer(player);
}
return team;
}
そして、期待どおりに次の結果が得られます。
- 休止状態: TEAM team_ から team2_0_ として team_.id、team_.team_name を選択します。ここで team_.id=?
- 休止状態: PLAYER player_ から player_.id、player_.player_name を player2_1_ として選択します。ここで、player_.id=?
- 休止状態: PLAYER player_ から player_.id、player_.player_name を player2_1_ として選択します。ここで、player_.id=?
- 休止状態: PLAYER player_ から player_.id、player_.player_name を player2_1_ として選択します。ここで、player_.id=?
- Hibernate: TEAM (team_name, id) 値 (?, ?) に挿入
- Hibernate: PLAYER (player_name, id) 値 (?, ?) に挿入
- Hibernate: PLAYER (player_name, id) 値 (?, ?) に挿入
- Hibernate: PLAYER (player_name, id) 値 (?, ?) に挿入
- 休止状態: PLAYER セット TEAM_ID=? を更新します。id=? 休止状態: PLAYER セット TEAM_ID=? を更新します。id=? 休止状態: PLAYER セット TEAM_ID=? を更新します。id=?
その後、私は次のことを行います。
Team team = createTeam(2) // creates team with 2 player ids={1,2}
session.saveOrUpdate(team);
孤立したプレイヤーが削除されることを期待していますが、次のようになります。
- 休止状態: TEAM team_ から team2_0_ として team_.id、team_.team_name を選択します。ここで team_.id=?
- 休止状態: PLAYER player_ から player_.id、player_.player_name を player2_1_ として選択します。ここで、player_.id=?
- 休止状態: PLAYER player_ から player_.id、player_.player_name を player2_1_ として選択します。ここで、player_.id=?
- Hibernate: update PLAYER set TEAM_ID=null where TEAM_ID=?
- 休止状態: PLAYER セット TEAM_ID=? を更新します。id=?
- 休止状態: PLAYER セット TEAM_ID=? を更新します。id=?
孤立したプレーヤー (id = 3) が切断されたままになりますが、削除されません...私が間違っているアイデアはありますか?