Основываясь на ответе JB Nizet, я изменил свой DAO, чтобы иметь DeleteOperationListener (Моя базовая реализация DAO основана на «Не повторять DAO» [1].) Таким образом, у меня есть универсальное решение на случай, если я окажусьв той же ситуации снова.Структура выглядит следующим образом:
public interface GenericDao<T, PK extends Serializable> {
// CRUD methods
// delete operation listeners.
void addDeleteListener(DeleteOperationListener<T, PK> deleteOperationListener);
public interface DeleteOperationListener<T> {
void preDelete(T entity);
void posDelete(T entity);
}
}
И моя абстрактная hibernate-реализация позволяет уведомлять наблюдателей об удалении.
@Override
public void delete(T entityToDelete) {
notifyPreDelete(entityToDelete);
this.getHibernateTemplate().delete(entityToDelete);
notifyPosDelete(entityToDelete);
}
А теперь у меня есть другой класс, который обрабатывает удалениедети без необходимости менять DAO:
@Service
public class ParentModificationListener
implements GenericDao.DeleteOperationListener<Parent> {
private ChildDao childDao;
@Autowired
public ParentModificationListener(ChildDao childDao, ParentDao parentDao) {
this.childDao = childDao;
parentDao.addDeleteListener(this);
}
@Override
public void preDelete(Parent parent) {
this.childDao.deleteChildrenFromParent(parent);
}
@Override
public void posDelete(Parent parent) {
// DO NOTHING
}
}
[1] http://www.ibm.com/developerworks/java/library/j-genericdao.html