OpenJPA делает определенные предположения, когда вы отсоединяете (и предположительно сериализуете) сущность, а затем объединяете ее обратно.
Обычно сериализация вызывает проблему такого рода - когда объект сериализуется, OpenJPA теряет свой StateManager, который отслеживает, какие поля были загружены. В результате, когда вы объединяете сущность обратно с нулевым значением, OpenJPA не уверен, что поле когда-либо было загружено, и думает, что оно не было изменено.
Есть несколько вариантов, чтобы это исправить:
Вы можете настроить OpenJPA на использование сериализуемого StateManager - и он будет отслеживать, какие поля вы загрузили. Для этого добавьте следующее свойство в файл persistence.xml.
<property name="openjpa.DetachState" value="loaded(DetachedStateField=true)"/>
Или скажите OpenJPA загрузить набор полей до отсоединения сущности. Затем OpenJPA будет знать, какие поля присутствовали, и будет правильно обрабатывать нулевое значение. Вы можете загрузить группы выборок (концепция OpenJPA, но по умолчанию загружаются все не ленивые поля) или каждое поле (это может быть дорого).
Я бы порекомендовал fetch-groups в большинстве случаев, вот свойство для 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