2015-11-17 3 views
0

Мы используем OpenJPA 2.3.0. У нас есть объекты DAO с свойствами типа Date и отношениями с другими объектами DAO. Мы извлекаем данные из базы данных, сопоставляем их с аналогичными объектами DTO и передаем их через провод. Мы также получаем те же объекты DTO по проводу, набираем их обратно в DAO и сохраняем данные в БД.OpenJPA сохранение значений NULL для сериализованных объектов

У нас возникли проблемы с полями «Дата», когда клиент NULL отправляет поле «Дата», и мы сохраняем это изменение, OpenJPA не обновляет поле до NULL, потому что он не может быть уверен, что это значение было загружено в первую очередь.

Мы попытались в том числе этот параметр persistence.xml:

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

Какой фиксированной даты спасительную проблемы, но затем вызвало проблемы на других лиц. Эта проблема была связана с объектами DAO, которые ссылались на другие объекты DAO (с помощью ссылки ManyToOne или OneToOne и т. Д.). Поскольку эти ссылочные объекты не были загружены изначально, когда мы сохраняли родительский объект, ссылка на дочерние элементы была бы NULL, и поэтому OpenJPA удалил бы дочернюю ссылку (каскадное сохранение было включено для сохранения).

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

Мне любопытно узнать, нашел ли кто-нибудь еще более элегантное решение для сохранения значений NULL для свойств Date для объектов DAO, которые сериализованы.

Класс для справки:

@Entity 
public class Parent implements Serializable { 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "child", fetch = FetchType.EAGER) 
private List<ChildType> children; 

@Temporal(TemporalType.DATE) 
private Date endDate; 
... 
+0

У вас есть„не пустой“ограничение на столбце БД, которая содержит дату –

+0

Там какая-то дискуссия, вокруг которых предлагают альтернативные варианты: 1. HTTP: //openjpa.208410.n2.nabble. com/Null-field-not-persisted-for-Dates-td5993519.html 2. http://stackoverflow.com/questions/2453671/nullable-date-column-merge-problem 3. https: //issues.apache. org/jira/browse/OPENJPA-2559 –

+0

@AlanHay Эти ссылки в значительной степени привели нас по тому пути, которым мы следовали выше. Проблема, которая у меня есть, - это компромисс, основной из которых - загрузка агара дополнительных данных. –

ответ

0

Пробовали ли вы?

jdbc: mysql: // HOST: 3306/DBNAME? ? zeroDateTimeBehavior = convertToNull "

+0

Это хорошая идея, но я понимаю, что она преобразует даты, поступающие из БД со значением «0000-00-00» в NULL на Java, но как установить свойство Date на моем DA O до нулевой даты перед сохранением? –

+0

Я понимаю ваш комментарий, потому что кажется, что вы хотите сохранить эти 0, о которых вы даже не упоминаете в своем оригинальном посте Шона. Так почему бы вам проголосовать за этот ответ, если это отличный действительный ответ, чтобы помочь сохранить нули в датах. Это актуальная проблема, которая обсуждалась много раз, когда этот ответ получил более 150 голосов и был выбран в качестве фактического ответа. Сохранение 0s в качестве дат не имеет такого смысла, поскольку такая дата не существует. В то время как null имеет больше смысла. благодаря – user1567291