Это вопрос шаблона проектирования, поэтому я проиллюстрирую его на простом примере приложения адресной книги.
Сначала несколько предположений.
1. Представляется приемлемым непосредственное использование доменных объектов БД в качестве резервного хранилища для форм Spring MVC.
Итерация 1 моего приложения Я создал сопоставленный объект JPA Person с различными прикрепленными атрибутами. Используя шаблон DAO, я создал объект постоянства, который может получать, хранить и удалять людей из базы данных. Кроме того, у меня есть фабричный метод create, чтобы я мог получить объект person. Используя этот объект DAO, я создаю простой веб-интерфейс. Все хорошо.
На итерации 2 мне нужно поддерживать несколько типов хранилищ, поэтому я создаю интерфейс для пользователя, который имеет несколько реализаций, и интерфейс для персистентности DAO, опять же с несколькими реализациями. Кроме того, человек был расширен, чтобы иметь возможность иметь несколько адресов.
interface IPerson {
public String getName();
public List<IAddress> getAddresses();
}
Но когда дело доходит до обновления веб-интерфейса, чтобы иметь возможность справляться с этими множественными реализациями, у меня возникает проблема. Реализация персистентности внедряется Spring. И, поскольку у этого объекта персистентности есть фабричный метод, у меня все хорошо для создания реализации IPerson. Но если я хочу сделать что-то необычное, например, разрешить отправку нескольких адресов в рамках одного запроса, у меня возникнет проблема. Чтобы позволить этому работать с Spring, вам, кажется, нужно использовать AutoPopulationList, поэтому Spring может просто .get (#) записать копию атрибутов в.
Итак, одним из решений этой работы является требование, чтобы все реализации персистентности использовали автоматически заполняемый список и создавали правильную реализацию для всех дочерних классов. Это уместно, учитывая, что нам нужно применить этот @PostLoad с JPA, поскольку базовые списки заменяются Hibernate.
Альтернатива состоит в том, чтобы не делать никаких предположений о реализации, переданной в реализацию постоянства, и преобразовывать / копировать объекты в соответствующий тип. Это выглядит лучше, так как тогда объект Domain остается простым, а вся сложность хранения находится в DAO. В этом случае мы использовали бы реализацию Default * интерфейсов IPerson и IAddress.
Несмотря на то, что мне нравится второй вариант лучше, я не обязательно чувствую себя комфортно в этой ситуации. Кто-нибудь может предложить какие-либо идеи или советы?