2012-04-21 56 views
2

我正在使用Spring 3和Hibernate 4來構建我的項目。繼續部分更新對象與休眠的方法

我的問題是,例如,一個用戶對象有五個字段,id,名稱,密碼,學校和地址。我只給予用戶更新/編輯他的學校和/或地址的權利。當用戶首次通過GET訪問編輯頁面時,我想用該用戶的現有信息填充該字段。

一旦提交按鈕被點擊,我想通過休眠來更改我的數據庫中相應的更新字段。

Controller.java

@RequestMapping(value="/edit/{userId}", method="RequestMethod.GET") 
public String toEdit(Model model,@PathVariable int userId){ 
    User user = userService.get(userId); 
    model.addAttribute("command",user); 
    return "/edit"; 
} 

@RequestMapping(value="/save", method="RequestMethod.POST") 
public String toSave(Model model){ 
    //how to implement this? 
} 

edit.jsp文件

<form:form action="/save" method="POST"> 
    <form:input path="school"/> 
    <form:input path="address"/> 
    <input type="submit"/> 
</form:form> 

我的想法是,如果我可以把未更新爲隱藏字段中文件edit.jsp,這樣,當這些領域User對象重新綁定(當提交表單時),我仍然可以捕獲用戶的ID,名稱和密碼信息。

我的方法的缺陷是顯而易見的。首先,密碼作爲隱藏領域永遠不會走。其次,它在edit.jsp頁面添加了不必要的信息。

我的第二個想法是,我只能在edit.jsp中將用戶標識設置爲隱藏字段,並且在提交表單時,我可以使用User user = userService.get(command.id)來獲取相應的用戶對象並設置字段(例如學校或地址)通過類似user.setSchool(command.getSchool())的那些新輸入的那些。在所有這些之後,我可以更新用戶對象。這種方法有點麻煩,因爲如果我有很多領域需要更新,會有很多代碼。

有沒有更好的方法來做到這一點? (我確定必須有一個)我對Spring和Hibernate很新,所以如果我錯過了一些非常明顯的東西,請告訴我。

謝謝。

回答

1

如果您使用"dynamic-update"只有修改的字段將被更新。 您可以使用@org.hibernate.annotations.Entity來標記您的實體進行動態更新。

@Entity 
@org.hibernate.annotations.Entity(
     selectBeforeUpdate = true, 
     dynamicInsert = true, dynamicUpdate = true) 
public class User { ... } 
+0

感謝您的回覆。我試過你的方法,但它似乎沒有達到我的預期。據我瞭解,動態更新意味着只有那些修改後的字段纔會在數據庫中更新。但是,當我在更新後重新綁定值時,我實際上已經丟失了名稱/密碼的值,因爲它們不存在於表單中。你對如何應對這個問題有任何想法嗎?謝謝。 – pippo 2012-04-21 16:37:54

+1

只要用戶的唯一標識符可用,就不需要在html表單中包含所有字段。如果用戶提交表單,則從數據庫中獲取由唯一標識符標識的用戶對象,並使用表單中的值更新字段。用戶標識符可以是數據庫ID(代理鍵)的用戶名(自然鍵)並且可以存儲在HTTP Sesssion中。也可以將整個(分離的)用戶對象存儲在HttpSession中,並將其與表單提交中的Hibernate會話重新連接。原理與上面的原理非常相似。 – andih 2012-04-21 18:18:28