21

休止状態のオブジェクトを保存するときに、プロパティのnull 値を無視する設定が休止状態にありますか?


私の場合、JSON を Jackson 経由で Hibernate Pojo にデシリアライズしています。

JSON には、Pojo の一部のフィールドのみが含まれています。Pojo を保存すると、JSON に含まれていなかったフィールドは Pojo で null になり、休止状態で更新されます。

設定に出くわしましたupdateable=falseが、これは 100% の解決策ではありません。 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-property

多分誰かが別の考えを持っている...

注 2:

Hibernate Docs によると、dynamicUpdate 注釈はまさにそれを行います

dynamicInsert / dynamicUpdate (デフォルトは false):
INSERT / UPDATE SQL が実行時に生成され、値が null でない列のみが含まれるように指定します。

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

dynamic-updatedocu を介して XML で定義した場合、NULL 値の処理については言及しないでください。

dynamic-update (オプション - デフォルトは false):
UPDATE SQL を実行時に生成し、値が変更された列のみを含めることができるように指定します。

注釈とxml 構成の両方を使用しているため、休止状態は注釈を無視しているようdynamicUpdate=trueです。

4

3 に答える 3

14

最初にDBから主キーを使用してオブジェクトをロードしてから、その上にJSONをコピーまたは逆シリアル化する必要があります。

値がnullのプロパティが明示的にその値に設定されているのか、それとも除外されているのかをHibernateが判断する方法はありません。

挿入の場合、dynamic-insert=trueが機能するはずです。

于 2011-09-22T17:49:55.887 に答える
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多くのフィールドを含むを受け取りました。これらのフィールドはおそらくnull、mysql に更新したくありません。データベースから取得し、tmp Obejctメソッドでフィールドを変更しgetNotNull、オブジェクトを更新します。

中国語解説版

于 2016-01-08T03:22:14.897 に答える