Note that there are some explanatory texts on larger screens.

plurals
  1. POHibernate does not delete orphans on OneToMany
    primarykey
    data
    text
    <p>I have the following pretty simple one to many relations:</p> <p>Team has a Set of players:</p> <pre><code>@Entity(name = "TEAM") @Access(AccessType.PROPERTY) public class Team{ private Integer id; private String name; private Set&lt;Player&gt; 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&lt;Player&gt; getPlayers() { return players; } public void setPlayers(Set&lt;Player&gt; players) { this.players = players; } } </code></pre> <p>And each player has a unique id &amp; name.</p> <pre><code>@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; } } </code></pre> <p>I run a very simple code:</p> <pre><code>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&lt;=players; ++ i){ Player player = new Player(); player.setId(i); player.setName("Player"+i); team.addPlayer(player); } return team; } </code></pre> <p>And I get the following as expected:</p> <ul> <li>Hibernate: select team_.id, team_.team_name as team2_0_ from TEAM team_ where team_.id=?</li> <li>Hibernate: select player_.id, player_.player_name as player2_1_ from PLAYER player_ where player_.id=?</li> <li>Hibernate: select player_.id, player_.player_name as player2_1_ from PLAYER player_ where player_.id=?</li> <li>Hibernate: select player_.id, player_.player_name as player2_1_ from PLAYER player_ where player_.id=?</li> <li>Hibernate: insert into TEAM (team_name, id) values (?, ?)</li> <li>Hibernate: insert into PLAYER (player_name, id) values (?, ?)</li> <li>Hibernate: insert into PLAYER (player_name, id) values (?, ?)</li> <li>Hibernate: insert into PLAYER (player_name, id) values (?, ?)</li> <li>Hibernate: update PLAYER set TEAM_ID=? where id=? Hibernate: update PLAYER set TEAM_ID=? where id=? Hibernate: update PLAYER set TEAM_ID=? where id=?</li> </ul> <p>Then later I do:</p> <pre><code>Team team = createTeam(2) // creates team with 2 player ids={1,2} session.saveOrUpdate(team); </code></pre> <p>And expect the orphan players to be deleted but I get:</p> <ul> <li>Hibernate: select team_.id, team_.team_name as team2_0_ from TEAM team_ where team_.id=?</li> <li>Hibernate: select player_.id, player_.player_name as player2_1_ from PLAYER player_ where player_.id=?</li> <li>Hibernate: select player_.id, player_.player_name as player2_1_ from PLAYER player_ where player_.id=?</li> <li>Hibernate: update PLAYER set TEAM_ID=null where TEAM_ID=?</li> <li>Hibernate: update PLAYER set TEAM_ID=? where id=?</li> <li>Hibernate: update PLAYER set TEAM_ID=? where id=?</li> </ul> <p>Which leaves the orphan player (id=3) disconnected but not deleted... Any ideas what I do wrong?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload