2011-09-22 196 views
16

有沒有休眠設置到忽略空值保存hibernate對象時的屬性?如何防止Hibernate更新空值

注意
在我的情況下,我通過傑克遜反序列化JSON到一個Hibernate的POJO。

JSON只包含Pojo的一些字段。如果我保存了Pojo,那麼不在JSON中的字段在Pojo中是空的,並且休眠會更新它們。

我來到了設置updateable=false,但這不是100%的解決方案。 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-property

也許有人有另外的想法...

注2:

根據Hibernate的文檔的dynamicUpdate註釋正是這麼做的

的dynamicInsert/dynamicUpdate(默認爲false):
指定INSERT/UPDAT E SQL應該在運行時生成 並且只包含其值不爲空的列

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-class

滑稽足夠,如果你通過dynamic-update的實況在XML定義它不提NULL值的hanlding。

dynamic-update(可選 - 默認爲false):
指定應該在運行時生成UPDATE SQL,並且只能包含其值已更改的那些列。

由於這樣的事實,我使用這兩種註釋 xml配置,休眠似乎忽略了我的dynamicUpdate=true註解。

+0

您可以使用動態更新,以避免尚未更新的屬性在SQL來,但它通常建議使用此設置實體有太多的屬性(列> 50)[參考之用時: Java持久性與Hibernate 2006版]。 @hvgotcodes正確地指出,如果永遠不會被持久化,你不必映射字段。 – frictionlesspulley

回答

9

您應該首先使用DB中的主鍵加載對象,然後在其上覆制或反序列化JSON。

hibernate無法確定具有null值的屬性是否已明確設置爲該值,或者已被排除。

如果是插入,那麼dynamic-insert = true應該可以工作。

+0

引導我走向正確的方向。最好是加載現有的對象並相應地更新這個對象。傑克遜甚至有一個默認行爲http://wiki.fasterxml.com/JacksonFeatureUpdateValue –

+0

我沒有任何空值在我的分貝。所以沒有人會明確地設置爲null。我還有其他解決方案嗎? @gkamal –

0

我對此有很多瞭解,但是對於我來說沒有任何解決方法。所以,我用了一個不優雅的解決方案來覆蓋它。

public void setAccount(Account a) throws HibernateException { 
    try { 
     Account tmp = (Account) session. 
       get(Account.class, a.getAccountId()); 
     tmp.setEmail(getNotNull(a.getEmail(), tmp.getEmail()));    
     ... 
     tmp.setVersion(getNotNull(a.getVersion(), tmp.getVersion())); 
     session.beginTransaction(); 
     session.update(tmp); 
     session.getTransaction().commit(); 
    } catch (HibernateException e) { 
     logger.error(e.toString()); 
     throw e; 
    } 
} 

public static <T> T getNotNull(T a, T b) { 
    return b != null && a != null && !a.equals(b) ? a : b; 
} 

我收到Object a裏面包含了很多fields.Those場也許null的,但我不希望他們更新到MySQL。 我從db獲得tmp Obejct,並通過方法getNotNull更改字段,然後更新Object。

a Chinese description edition