例如:我有User.class和Post.Class 我想使用休眠从该表中获取所有行。
TypedQuery<Post> query = SessionFactory.getCurrentSession().createQuery("from Post");
我也有dao层,UserDao和PostDao。而且我有类似这样的方法的抽象类CrudDao:
public abstract class CrudDao<T> {
@Transactional
public void save(T entity) {
SessionFactory.getCurrentSession().save(entity);
}
}
因此,我的用户和dao只是扩展了此crudDao,我不需要为他们编写save方法。当我想获取所有行时,我需要写“ from MyEntitie”。但是我想使这种方法也变得抽象,所以我不需要为每个dao多次编写它。但是我不能用抽象方法写“ from T”。
我也试图这样做:
List<T> getAll(Class<T> type){
CriteriaQuery<T> criteria = builder.createQuery(type);
criteria.from(type);
return
SessionFactory.getCurrentSession().createQuery(criteria).getResultList();
}
所以在我的服务中,我这样称呼我的道:
PostDao.getAll(Post.class);
有人告诉我,我的服务不应该知道我的实体,我的服务电话应该是
PostDao.getAll();
如果我确实喜欢这个^,我需要在每个dao中编写getAll方法,它看起来像很多复制粘贴的代码。
可以在我的项目中如何做或如何给我一些建议吗?
答案 0 :(得分:0)
我从deHaar那里学到的回复: 您可以使用泛型dao创建抽象方法,并在创建此泛型类型的变量时调用泛型类。例如,我的泛型dao:
public abstract class CrudDao<T> {
private Class<T> type;
public CrudDao(Class<T> type){
this.type = type;
}
@Transactional
public T getById(,int postId) {
return sessionFactory.getCurrentSession().get(type, postId);
}
}
因此,您只需要编写一个构造函数,即可在扩展通用dao的子Dao中调用超类构造函数。 喜欢:
public class PostCommentDao extends CrudDao<PostComment> {
public PostCommentDao(){
super(PostComment.class);
}
}
现在一切都可以从通用的dao开始工作!
正如塔诺斯(Tanos)所说:为救赎付出的代价很小。
答案 1 :(得分:0)
我认为,通用DAO是反模式。 Spring为您提供了由@Controller
(用于mvc和rest),@Service
(用于功能可重用性)和@Repository
(用于数据访问)组成的出色的三层体系结构。可以有更多代码只是让它承担一个责任而已。