2013-02-04 98 views
27

時刪除列表的孩子,我有以下實體:休眠@OneToMany更新父

TEAM

@Entity 
@Table 
public class Team { 
[..] 
private Set<UserTeamRole> userTeamRoles; 

/** 
* @return the userTeamRoles 
*/ 
@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "team", fetch = FetchType.LAZY) 
public Set<UserTeamRole> getUserTeamRoles() { 
    return userTeamRoles; 
} 

/** 
* @param userTeamRoles 
*   the userTeamRoles to set 
*/ 
public void setUserTeamRoles(Set<UserTeamRole> userTeamRoles) { 
    this.userTeamRoles = userTeamRoles; 
} 

}

USER_TEAM_ROLE

@Entity 
@Table(name = "user_team_role") 
public class UserTeamRole { 

@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY) 
@JoinColumn(name = "FK_TeamId") 
public Team getTeam() { 
    return team; 
} 
} 

現在,當使用{UTR1,UTR3}更新包含Team.userTeamRoles = {UTR1,UTR2}的Team實體時,我想要刪除UTR2。但我現在這樣做,舊列表保持不變,它只是將UTR3添加到列表中。

這是我如何做到這一點的時刻:

if (!usersDualListData.getTarget().isEmpty()) { 
     // the role for each user within the team will be "employee" 
     team.setUserTeamRoles(new HashSet<UserTeamRole>()); 
     Role roleForUser = roleService 
       .getRoleByName(RoleNames.ROLE_EMPLOYEE.name()); 
     for (User user : usersDualListData.getTarget()) { 
      UserTeamRole utr = new UserTeamRole(); 
      utr.setUser(user); 
      utr.setTeam(team); 
      utr.setRole(roleForUser); 
      team.getUserTeamRoles().add(utr); 
     } 
    } 

teamService.updateTeam(team); 

我認爲做team.setUserTeamRoles(new HashSet<UserTeamRole>());名單將被重置,因爲級聯前面的列表將被刪除。

任何幫助表示讚賞。謝謝你更換你有收集(team.setUserTeamRoles(new HashSet<UserTeamRole>());)到clear()現有之一

+0

我覺得這裏是同樣的問題:http://stackoverflow.com/questions/2011519/jpa-onetomany-not-deleting-child檢查出來! –

回答

82
  1. 相反。發生這種情況是因爲如果Hibernate從DB加載實體(及其集合),它會「管理」它們,即。跟蹤他們的變化。通常在使用Hibernate時,最好是而不是來爲集合(列表,集合)創建任何setter。僅創建,吸氣,並清除由它返回的集合,即:

    team.getUserTeamRoles().clear();

  2. 另一件事是,你錯過了孤兒缺失(即當它從集合中的父刪除刪除子對象)。要啓用它,您需要在擁有實體中添加@OneToMany(orphanRemoval=true)

+2

是的,clear + orphanRemoval完成了這個任務。非常感謝! – AndaP

+0

@Adam Dyga Hibernate noob here,你能解釋一下爲什麼最好不要爲集合創建任何setter? – Jonathan

+0

@Jonny嘗試用新的實體替換實體中的集合(例如new ArrayList()),並查看保存時會發生什麼;) –