GenericDao
Ну, для меня, если ваш GenericDAO является «универсальным», то вам может понадобиться только один экземпляр , и делать все с этим единственным экземпляром.
Я уверен, что вас не беспокоит, например, в связи с повторением, вы злитесь (и я с вами согласен).
Например, вы можете передать класс Entity универсальному методу .
- public void save (Class, E ...): позволяет сохранить один или несколько экземпляров типа E, где E является одним из ваших объектов.
- public E load (Class, Long id): загружает объект.
...
/** Assuming the entities have a superclass SuperEntity with getIdent(). */
public class GenericDaoImpl implements GenericDao {
/** Save a bunch of entities */
public void save(SuperEntity... entities) {
for(SuperEntity entity : entities) {
getSession().save(entity);
}
}
/** Load any entity. */
public <E extends SuperEntity> E load(Class<E> entityClass, Long ident) {
return (E)getSession().load(entityClass, ident);
}
// other generic methods
}
Вариант
В наших приложениях у нас фактически есть вариант для этого. Поскольку у нас много специфических запросов для каждого Дао, нам все равно нужны определенные классы Дао (создайте класс и подключите его), поэтому, чтобы избежать особого случая Дао, который не будет определен, мы сразу создадим определенные классы Дао.
Кодирование
Но мы никоим образом не повторяем код. Все наши Daos расширяют GenericDao, предоставляя в конструкторе необходимый параметр Class. Пример кода (не полный, простой, чтобы понять основную идею):
public abstract class GenericDaoImpl<E extends SuperEntity>
implements GenericDao<E> {
/** Available for generic methods, so it is not a parameter
* for the generic methods. */
private final Class<E> entityClass;
protected GenericDaoImpl(Class<E> entityClass) {
this.entityClass = entityClass;
}
// generic implementation ; can be made efficient, as it may
// send the orders as a batch
public void save(E... entities) {
for(SuperEntity entity : entities) {
getSession().save(entityClass, entity.getIdent());
}
// possibly add flushing, clearing them from the Session ...
}
// other generic methods
}
public class PersonDaoImpl extends GenericDaoImpl<Person>
implements PersonDao {
/** Constructor, instanciating the superclass with the class parameter. */
public PersonDaoImpl() {
super(Person.class);
}
/** Specific method. */
public List<Person> findByAge(int minAge, int maxAge) {
//....
}
}
Электропроводка
Соединение всех бобов не смертельно. В настоящее время существует множество политик автоматического подключения, вам не нужно об этом беспокоиться. Увидимся весной
http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config