Я работаю над довольно простым 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. я покажу пример:
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 в изоляции, если я хочу использовать объекты Клуба, у которых есть поля их коллекции, заполненные объектами Player.
Сначала мне нужно перенести объект Player, чтобы я мог добавить его в объект Club, чтобы я мог передать его тестируемому GenericDao.
Я искал книгу PoEAA от Fowler для решения, но я немного запутался, где O/R-фреймворк, подобный Hibernate, подходит для шаблонов, которые он описывает.
Я знаю, что JPA имеет разные реализации. Но предположим, что я хотел бы реализовать слой persistence с помощью iBatis. – prasopes 2010-11-30 08:56:43