2013-09-30 67 views
1

我有一個問題春休眠,當我更新這將刪除相關角色的用戶... 難道是一個級聯的事項?我已經試過各種級聯配置的...春休眠時更新的用戶會刪除其作用

@MappedSuperclass 
public abstract class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column 
    private int id; 

    @OneToOne(cascade = { CascadeType.ALL } ) 
    @JoinTable(name="user_roles", 
     joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}, 
     inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")} 
    ) 
. 
. 
. 
} 

角色

@Entity 
@Table(name="roles") 
public class Role { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    private String authority; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="user_roles", 
     joinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}, 
     inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")} 
    ) 
    private Set<User> userRoles; 
. 
. 
. 
} 

UserRole的

@Entity 
@Table (name = "user_roles") 
public class UserRole { 
    @Id 
    @Column(name = "user_id") 
    private int userId; 

    @Column(name = "role_id") 
    private int roleId; 
. 
. 
. 
} 

在UserDAOImpl

@Override 
    public void updateUser(User user) { 
     try { 
      this.sessionFactory.getCurrentSession().update(user); 
     } catch (HibernateException e) { 
      System.out.println(e); 
     } 
    } 

我得到了用戶這樣的(誰已經登錄的):

@RequestMapping(value = "/edit/", method = RequestMethod.GET) 
    public String editUser(ModelMap map,Principal principal) { 
     try{ 
      //Get logged in username 
      String loggedUserEmail = principal.getName(); 
      User user = userService.getUserByEmail(loggedUserEmail); 

      map.addAttribute("user", user); 

     } catch(Exception e) { 
      log.error("/user/edit/---"+e); 
     } 


     return "forms/userForm"; 
    } 

然後我嘗試提交用戶窗體上的一些變化後更新。

啊,我插入的UserRole這樣的:

//Add userRole to db 
      UserRole userRole = new UserRole(); 
      userRole.setUserId(user.getId()); 
      userRole.setRoleId(1); 
      userRoleService.addUserRole(userRole); 
+0

您不必在用戶類中提及級聯,如果您不提及級聯,那麼您必須使用不同的Dao實現updateRoles(設置角色)手動添加用戶角色。 – Zeus

回答

0

Session.update使分離對象持久化(指對象的Hibernate會話的版本現在反映這些變化)。所以,如果你在傳遞一個對象,你沒有從當前Hibernate會話(或許真的在HTTP會話掛出,或者你只是new創建的東西)獲得,則該對象可能不會有一個鏈接到它的UserRole,當你叫update休眠認爲,因爲參考丟失,這意味着你告訴它刪除的UserRole。

猜測您正在使用具有Id但與會話分離的現有用戶:嘗試使用該用戶的ID來調用Session.load以獲取新的附加用戶(因此它將是最新的用戶)日期,包括擁有現有的UserRole),然後對該對象進行所需的更改,然後讓其承擔責任。 UserRole應該保留。

+0

感謝您的有用答案;我編輯了我的問題,插入關於如何獲取和更新用戶的詳細信息......是正確的方式嗎?遺憾的是它仍然會刪除其關聯的角色......我說如果我試圖讓用戶角色之前更新它,它正確地檢索它! –

+0

@Andrea:所以你有一個分離的用戶。你確認UserRole是否在分離用戶上?因爲我有哪裏得到的實體從形式重新填充之前應對方案,很容易失去這樣的東西。 –

+0

如果你的意思是,如果我能得到用戶的角色之前更新它的答案是肯定的!順便說一句,我已經更新了問題,添加了每次創建新用戶時保存用戶角色的方式 –