Как я могу запретить 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
,затем обновите объект.