Хорошее место для начала - это Общая статья DAO , вышедшая в 2006 году, но содержащая некоторую полезную информацию.Чтобы обновить общий DAO для Spring, спящий режим и аннотации, это то, что я сделал.Также эта более новая статья также весьма полезна.
Весь идентификатор является универсальным интерфейсом, чтобы убедиться, что класс имеет I getId()
и setId(I id)
Создатьуниверсальный интерфейс DAO
public interface GenericDao<T extends Identifier<I>, I extends Serializable> {
public T find(I id);
public void delete(T obj);
public void saveOrUpdate(T obj);
}
Создание реализации GenericDAO
public abstract class GenericDaoImpl<T extends Identifier<I>, I extends Serializable> implements GenericDao<T, I>{
private Class<T> type;
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected SessionFactory getSessionFactory() {
if (sessionFactory == null)
throw new IllegalStateException("SessionFactory has not been set on DAO before usage");
return sessionFactory;
}
public Class<T> getType() {
return type;
}
public GenericDaoImpl() {
this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Transactional(readOnly = true)
@Override
public T find(I id) {
return (T) getSessionFactory().getCurrentSession().get(getType(), id);
}
@Transactional
@Override
public void delete(T obj) {
getSessionFactory().getCurrentSession().delete(obj);
}
@Transactional
@Override
public void saveOrUpdate(T obj) {
getSessionFactory().getCurrentSession().saveOrUpdate(obj);
}
}
Интерфейс DAO объекта:
public interface SomeObjectDao extends GenericDao<SomeObject, Long>{
}
Реализация DAO объекта
@Repository
public class SomeObjectDaoImpl extends GenericDaoImpl<SomeObject, Long> implements SomeObjectDao {
}
теперь в любом классе, который нуждается в этом, например, в классе обслуживания, вы можете получить автопроводку, просто добавив необходимый вам класс объекта dao
@Autowired
private SomeObjectDao someObjectDao;