2012-08-23 65 views
2

我有一個客戶表,其中有3列,即id,名稱和年齡。dynamicUpdate不工作在休眠

如果我創建了一個沒有年齡的客戶對象,即我沒有設置任何年齡值,那麼萬一如果表中存在同一個客戶(由客戶ID標識),則saveOrUpdate()會更新年齡列爲0.我希望避免年齡列值被零或空覆蓋,如果已經存在於表中根據下面粘貼的代碼片段,如果已經存在具有某個年齡值的客戶ID 10的行,則在這種情況下,我的年齡不應該被零覆蓋。

我在谷歌搜索,發現我可以設置dynamicUpdate爲真實現。但在執行的代碼仍然是我的年齡值由0覆蓋我粘貼代碼片段

@Entity 
@Table(name = "CUSTOMER") 
@org.hibernate.annotations.Entity(
     dynamicUpdate = true 
) 
public class Customer { 

    @Id 
    @GeneratedValue 
    @Column(name = "CUSTOMER_ID") 
    private int custId; 

    @Column(name = "CUSTOMER_NAME") 
    private String custName; 

    @Column(name = "CUSTOMER_AGE") 
    private int custAge; 
     ............ 
     ........... 

     Customer cust = new Customer(); 
     cust.setCustId(10); 
     cust.setCustName("anand");  
     session.saveOrUpdate(cust);  
     tx.commit(); 

回答

1

第一:最好使用一個Integer代替int的作爲custAge類型。這樣你可以區分一個空值和一個有效的0值。

然後,dynamicUpdate = true對於您要做什麼很有用,但您還需要將對象重新掛接到會話(在更新情況下)。例如:

customer = session.get(Customer.class, id); 
customer.set(...); 
session.saveOrUpdate(customer); 
+0

但它也覆蓋age的值爲null。我不希望年齡值在數據庫中已經存在的情況下被覆蓋。 – Anand

+0

我改變了問題描述。我現在明確自己嗎? – Anand

+0

更新了答案。 – dcernahoschi

0

動態更新工作,只有當我們第一次使用session.get(...) 在這種情況下取​​值,假設我們有10列,我們要更新5列,然後開始我們獲取對象通過使用ID,然後在設置新值獲取對象和正常工作 更多我們只寫編碼5列,如果我們再通過使用動態更新查詢消防更新從5列一列如下所示

休眠:更新usermaster set name =?其中user_id =?下面

是我的代碼,在這裏我只chenged從前端

Session session = sessionFactory.openSession(); 
    Transaction tran = session.beginTransaction(); 
    Usermaster obj = (Usermaster) session.get(Usermaster.class, 
      usermaster.getUserId()); 
    obj.setUsername(usermaster.getUsername()); 
    obj.setName(usermaster.getName()); 
    obj.setContact(usermaster.getContact()); 
    obj.setEmail(usermaster.getEmail()); 
    obj.setUserStatus(usermaster.getUserStatus()); 
    obj.setUserType(usermaster.getUserType()); 
    session.update(obj); 
4

名稱,以便於dynamicUpdate工作,get和更新必須在同一個事務。