2015-12-24 56 views
0

我在Web應用程序中使用Spring和Hibernate。我有一個實體如下:如何更新Hibernate中的某些實體字段?

@Entity 
public class MyClass{ 
    @Id 
    @GeneratedValue 
    protected Long id; 

    protected String prop1; 

    protected String prop2; 

    /* 
    * Getters And Setters 
    */ 

} 

當我要更新這個實體的實例,我用傑克遜如下得到客戶實例:

@Inject 
SessionFactory sf; 

@RequestMapping("update") 
@Transactional 
public void update(@RequestBody MyClass myClass){ 
    sf.getCurrentSession.update(myClass); 
} 

用戶數據如下:

{ 
    "prop1": "my value1", 
    "prop2": "my value2" 
} 

這個工作正常。我的問題是當我只想更新prop1。在這種狀態下,我也必須設置prop2。如果我不知道,它會將prop2更新爲null

如何才能更新prop而不發送prop2從客戶端到服務器

+0

如果你想有確切的更新查詢控制(即哪些字段應該包含在查詢)將被解僱,使用HQL UPDATE語句。使用session.save/update/merge/saveOrUpdate hibernate會在內部創建查詢,並且您將不會擁有可能需要的細粒度控件。 –

+0

你應該使用spring Data JPA。 http://projects.spring.io/spring-data-jpa/有一些非常好的例子可以讓你所有的CRUD操作變得輕而易舉。 –

+0

[JPA:只更新特定字段]的可能重複(http://stackoverflow.com/questions/27818334/jpa-update-only-specific-fields) –

回答

-2

您可以使用@DynamicUpdate註釋爲了在pojo類上這樣做。這僅更新所需的字段

樣本:

@Entity 
@DynamicUpdate//Add this annotation for updating selected fields 
public class MyClass{ 
    @Id 
    @GeneratedValue 
    protected Long id; 
    protected String prop1; 

    protected String prop2; 

    /* 
    * Getters And Setters 
    */ 

}  
+0

必填字段?哪些是必填字段? –

+0

我的意思是說,只有你正在更新的各個領域 –

+0

無法正常工作。 –

1

@DynamicUpdate不會解決你的問題。此註釋僅用於性能優化。

如果你只想更新實體的某些屬性,下面的一些方法:

  1. 寫原生SQL查詢來更新列(字段)。 (不建議,因爲儘可能在實體中儘可能重用您的映射)。

  2. 首先從數據庫中獲取實體,然後更新您想要保存的字段。 由於在這種情況下不必要的代碼,通常不推薦使用。爲什麼我們不得不在這裏手動獲取實體。但是如果有不同的apis只更新一個字段,比如update1 api更新字段1,update2 api更新字段2,update3更新字段3,.... updateN api更新字段N,這種方法會比下一個更好(在維護代碼方面)下一個需要幾個不同的更新查詢。但是這種需求非常罕見,不會推薦這種解決方案。

  3. 使用HQL。像「更新MyClass mc設置mc.prop1 =:prop1parameter其中mc.id =:idparameter」,並適當地設置參數。 (推薦

相關問題