2012-06-20 2 views
1

Рекомендуемый способ использования merge() - сначала сначала получить DTO, прежде чем вводить изменения.Hibernate: Doman Model to JPA Entity/DTO & Merge() Схема проектирования или передовая практика

public void merge(PersonModel model) { 

Person inputDTO = PersonBuilder.build(model) 

Person dto = get(pk) 
dto.setName(inputDTO.getName()) 

dto.getChildren().clear() 

Iterator<Child> iter = inputDTO .getChildren().Iterator(); 

while(iter.hasNext()){ 
    dto.getChildren().add(iter.next()); 
} 

dto.merge(); 

}

Есть ли более элегантный способ проведения такой операции перевод домена модели в DTO и слияние его с тем, что никакие данные не будут случайно удалены.

Пример задачи: Hibernate: prevent delete orphan when using merge();

Я считаю необходимость очистить список и добавить его очень расточительно.

Может ли кто-нибудь порекомендовать мне шаблон дизайна или способ его правильного кодирования?

Спасибо

ADD ON:

1) Можно использовать Hibernate HashSet заменить список? Будет ли hibernate hashset заменять базу элементов на первичные ключи?

любая помощь?

+1

Было бы намного яснее, если бы вы не использовали термин DTO для обозначения объекта JPA. –

+0

Редактированное название ... будет редактировать контент, как только я вернусь с работы. – seesee

+0

Является ли отношение к Child @OneToMany, или это композит? – wrschneider

ответ

3

«Рекомендуемый способ использования слияния() является первым получить DTO первый перед вводом изменений»

Кто рекомендует вам сделать это?

«Есть ли более элегантный способ выполнения такой операции, переводя доменную модель в dto и слияние ее, чтобы никакие данные не были случайно удалены».

Я не думаю, что вы можете переводить объекты домена в DTO. DTO - это всего лишь данные, объект домена - это данные, поведение и контекст. Полностью отличается.

Если у вас нет объектов поведения и контекстов в ваших объектах домена (a.k.a. anemic domain model), вам не нужен дополнительный слой DTO, который просто дублирует объекты.

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

Возможно использование Hibernate Hashset для замены списка? Будет ли спящий хешсет заменять базу элементов на первичные ключи? "

Я бы заменил список на Hashset, поскольку таблица, в которой будут храниться данные, представляет собой набор, а не список (вы не можете иметь дубликаты записей). Хешсет не будет заменять элементы на основе первичных ключей. Набор (любой набор, реализация Hibernate не отличается) работает, предотвращая дубликаты. Он использует вашу реализацию equals() и getHashCode(), чтобы узнать, есть ли уже объект в этом наборе. Если это так, оно не будет добавлено, но оно сохранит оригинал.

+0

Кто вам рекомендовал? >> См. Ссылку. Моя модель домена немного отличается от моей точки (есть веская причина). Вы имеете в виду, что hibernate будет «авто» слияния, даже я не использовал .update() или .merge(). – seesee

Смежные вопросы