Я пытаюсь создать хороший шаблон для своего приложения. Я хочу максимально сократить дублирующийся код и максимально использовать дженерики. Я создал шаблон для этого, но я хочу знать, есть ли что-то не так с кодом или есть ли другой лучший шаблон для этого.
Интерфейс BaseDao:
public interface BaseDao<T extends DTO> {
List<T> fetchAll();
}
BaseImplementetion: все классы DAO будут расширять этот класс.
public abstract class BaseDaoImpl<T extends DTO> implements BaseDao {
private Class<T> clazz;
public BaseDaoImpl(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public List<T> fetchAll() {
List<T> entities = null;
Session session = null;
try {
session = doOpenSession();
Query<T> query = session.createQuery("from " + clazz.getName());
entities = query.list();
} catch (Exception e) {
throw e;
} finally {
session.close();
}
return entities;
}
Интерфейс UserDao:
public interface UserDao extends BaseDao{
User getUserByUsername(String username);
}
Реализация UserDao:
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
public UserDaoImpl() {
this(User.class);
}
private UserDaoImpl(Class<User> clazz) {
super(clazz);
}
public User getUserByUsername(String name) {
User user = null;
try (Session session = HibernateUtils.getSessionFactory().openSession()) {
String hql = "FROM User u WHERE u.username = :name";
Query<User> query = session.createQuery(hql).setMaxResults(1);
query.setParameter("name", name);
user = query.uniqueResult();
}
return user;
}
}
PS: Итак, я хочу создать все основные операции c (добавить, сохранить, обновить, getAll и c) в моем BaseDaoImpl и после этого все классы DAO наследовать класс.
Как вы думаете, этот подход может принести мне проблемы позже?