Как я могу запретить Hibernate обновлять значения NULL

есть ли настройка в спящем режиме для игнорировать значения null свойств при сохранении объекта hibernate?

Примечание
В моем случае я де-сериализую JSON в спящий режим Pojo через Jackson.

JSON содержит только некоторые из полей Pojo. Если я сохраняю Pojo, поля, которые не были в JSON, равны нулю в Pojo, и hibernate обновляет их.

Я пришел через настройку updateable=false, но это не 100% решение. http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-property

может у кого-то есть другая идея...

примечание 2:

согласно документам Hibernate dynamicUpdate аннотации именно это

dynamicInsert / dynamicUpdate (по умолчанию false):
указывает, что SQL INSERT / UPDATE должен создаваться во время выполнения и содержать только столбцы чьи значения не равны null.

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

достаточно смешно, если вы определяете его в XML через dynamic-update docu не упоминает hanlding нулевых значений.

dynamic-update (необязательно-по умолчанию false):
указывает, что обновление SQL должно быть > создано во время выполнения и может содержать только те столбцы, значения которых изменились.

из-за того, что я использую обе аннотации и xml-конфигурация, hibernate, похоже, игнорирует мой dynamicUpdate=true Примечание.

2 ответов


вы должны сначала загрузить объект с помощью первичного ключа из БД, а затем скопировать или десериализовать JSON на вершине.

для hibernate нет способа выяснить, было ли свойство со значением null явно установлено на это значение или оно было исключено.

Если это вставка, то dynamic-insert=true должен работать.


Я много гуглил об этом, но для меня нет самого решения.Поэтому я использовал не изящное решение, чтобы покрыть это.

  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 ,затем обновите объект.

китайское издание описания