Я был также поклонником -convention GenericDao и GenericDaoImpl с некоторой поддержкой от общих вспомогательных классов, если сохранить или удалить требуются дополнительные действия для некоторых стойких классов:
public interface PersistListener<T> {
void onPersist(T item);
}
Аналогичные конструкции могут также использоваться для удаления. Это особенно полезно, если вам нужен какой-то журнал событий для записи каждого действия, и вы не хотите использовать AOP для этого.
Моих GenericDaoImpl будут выглядеть примерно так:
public class GenericDaoImpl<T> extends HibernateTemplate {
public void setPersistListeners(List<PersistListener> listeners) {
this.persistListeners = new GenericInterfaceHandler(listeners,
PersistListener.class);
}
// hibernate updates the key to the object itself
public T save(T item) {
getSession().save(item);
List<PersistListener<T>> listeners = this.persistListeners.getAll(item);
for (PersistListener<T> listener : listeners)
listener.persist(item);
}
// ...
}
Что persistListener в приведенном выше примере будет сделать, это найти PersistListener с общим соответствием класса в том, что из класса в качестве параметра. Он такой найден, тогда вызов делегируется правильному слушателю (слушателям). Мой GenericInterfaceHandler также может использоваться для возврата только самого конкретного обработчика или только обработчика для данного класса, если он присутствует.
Если вам интересно, я мог бы также опубликовать реализацию GenericInterfaceHandler, поскольку это довольно мощная конструкция во многих случаях.
Спасибо! Кроме того, было бы целесообразно разместить мои DAO-интерфейсы в пакете dao и реализации в пакете dao.hibernate (чтобы можно было поменять местами позже)? – oym
Это имеет смысл – Kevin