Как я могу предотвратить Hibernate от обновления значений NULL - PullRequest
18 голосов
/ 22 сентября 2011

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

ПРИМЕЧАНИЕ
В моем случае ясериализация 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):
указывает, что SQL INSERT / UPDATE должен генерироваться во время выполнения и содержать только столбцы , значения которыхне нуль .

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

Достаточно забавно, если вы определите его в XML с помощью dynamic-update, в документе не упоминается обработка значений NULL.

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

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

Ответы [ 2 ]

12 голосов
/ 22 сентября 2011

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

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

Если это вставка, то динамическая вставка = истина должна работать.

0 голосов
/ 08 января 2016

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

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

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

...