Я работаю над довольно простым приложением CRUD с веб-интерфейсом. Я использую общий шаблон DAO в слое постоянства. Интерфейс моего универсального DAO выглядит так:
public interface GenericDAO<T> {
void create( T entity ) throws CannotPersistException;
T findById( Long id ) throws NotFoundException;
Collection<T> findAll();
void update( T entity ) throws CannotPersistException, NotFoundException;
void delete( Long id ) throws CannotPersistException, NotFoundException;
}
Этот интерфейс реализован с использованием JPA, но у меня также есть реализация в памяти, главным образом для целей тестирования. У меня нет никаких других классов в слое постоянства , я просто создаю один экземпляр этого DAO для каждого класса домена.
Проблема, с которой я сталкиваюсь, заключается в том, как правильно сохранить объект, имеющий ссылки на другие объекты, которые также необходимо сохранить. Я знаю, что каскадирование в JPA решило бы эту проблему, не требуя от меня добавления новых классов в свой уровень персистентности. Однако это сделало бы меня зависимым от конкретной реализации (и также нарушило бы мою реализацию DAO в памяти) ,
Правильно, я использую сервисный уровень для управления классами DAO и решаю проблему, работая с несколькими DAO . 1014 * Я покажу пример:
public class PlayerServiceImpl implements PlayerService {
private GenericDAO<Player> playerDAO;
private GenericDAO<Club> clubDAO;
//constructor ommited
public Player addNewPlayer( Player player, Long clubId ) throws NotFoundException,
CannotPersistException {
Club club = clubDAO.findById( clubId );
player.setClub( club );
playerDAO.create( player );
club.addPlayer( player );
clubDAO.update( club );
return player;
}
//... other methods
}
Первый недостаток этого подхода заключается в том, что он делает мою модель предметной области анемичной - большинство методов - это просто методы получения и установки, а большая часть бизнес-логики находится на уровне обслуживания.
Я обнаружил другой недостаток при тестировании приложения - Я не могу по-настоящему протестировать класс GenericDao в отдельности , если я хочу использовать объекты Club, в которых поля их коллекции заполнены объектами Player.
Сначала мне нужно сохранить объект Player, чтобы добавить его к объекту Club, чтобы передать его тестируемому GenericDao.
Я искал книгу Фаулера по PoEAA, чтобы найти решение, но я немного запутался, когда O / R-фреймворк, такой как Hibernate, вписывается в шаблоны, которые он описывает.