Я также был поклонником соглашений 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, так как это довольно мощная конструкция во многих случаях.