2012-01-08 71 views
1

我目前正在開發一個社交網站,我目前正在實施用戶可以更改密碼的部分。我正在使用實體管理器用新密碼刷新數據庫的內容。以下是實施的代碼。爲什麼刷新實體管理器時不更新數據庫?

final Implementation user = em.find(Implementation.class, username); 
      if((user!=null) && user.getPassword().equals(hash(username,oldPassword))){ 
      user.setPassword(hash(username,newPassword)); 

      em.refresh(user); 
     }else{ 
      throw new ChangePasswordException(); 
     } 

但是當我嘗試重新登錄時,必須使用舊的密碼,否則,如果新密碼提供它會告訴你:密碼不匹配。有誰知道也許爲什麼會發生這種情況?我試圖先從數據庫中刪除用戶,然後再次保留新用戶。但是,由於用戶未從數據庫中刪除,用戶名不唯一,因此生成了EJB異常。

非常感謝您的幫助

+0

你有沒有tryed em.flush()? – kiki 2012-01-08 15:54:38

+0

它與合併作爲托馬斯建議......非常感謝 – ict1991 2012-01-08 16:01:54

回答

3

您不保存您的新密碼。您正在覆蓋您所做的更改。因此refresh(user)將獲取該用戶的當前狀態並將其寫入您的對象。

docu:刷新數據庫中實例的狀態,覆蓋對實體所做的更改(如果有)。

嘗試使用mergepersist代替

+0

非常感謝...合併做的工作......但堅持不會工作,因爲它試圖將信息放回數據庫,並且由於主鍵已經存在...... EJB異常將生成 – ict1991 2012-01-08 16:01:07

+0

^^正確。所以在你的情況''merge''是你需要的方法;) – thomas 2012-01-08 16:02:03

相關問題