Вопрос

Я использую JPA с реализацией openjpa ниже на сервере приложений Geronimo.Я также использую базу данных MySQL.У меня проблема с обновлением объекта со свойством Date, допускающим значение NULL.Когда я пытаюсь объединить объект со свойством Date, для которого установлено значение null, сценарий обновления sql не создается (или когда изменяются другие поля, создается сценарий обновления sql, но поле даты в нем отсутствует).Если в поле даты установлено какое-либо другое значение, отличное от нуля, скрипт обновления генерируется правильно.

Была ли у кого-нибудь такая проблема?

Это было полезно?

Решение

OpenJPA делает определенные предположения, когда вы отделяете (и, предположительно, сериализуете) объект, а затем объединяете его обратно.

Обычно такая проблема возникает из-за сериализации: когда объект сериализуется, OpenJPA теряет свой StateManager, который отслеживает, какие поля были загружены.В результате, когда вы снова объединяете объект с нулевым значением, OpenJPA не уверен, что поле когда-либо было загружено, и считает, что оно не было изменено.

Есть несколько вариантов это исправить:

Вы можете настроить OpenJPA на использование сериализуемого StateManager, и он будет отслеживать, какие поля вы загрузили.Для этого добавьте следующее свойство в файл persistence.xml.

<property name="openjpa.DetachState" value="loaded(DetachedStateField=true)"/>

Или скажите OpenJPA загрузить набор полей до отсоединения объекта.Тогда OpenJPA узнает, какие поля присутствовали, и правильно обработает нулевое значение.Вы можете загрузить группы выборки (концепция OpenJPA, но по умолчанию она загружает все поля, не относящиеся к LAZY), или каждое поле (это может быть дорого).

В большинстве случаев я бы рекомендовал группы выборки, вот свойство persistence.xml.

<property name="openjpa.DetachState" value="fetch-groups"/>

Если вам так хочется, вы можете делать некоторые хитрые вещи с графами отдельных объектов.Руководство OpenJPA содержит дополнительную информацию по адресу http://openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#ref_guide_detach_graph

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top