我可以使用通用方法从休眠中的不同实体访问数据吗

时间:2019-06-18 11:50:53

标签: java hibernate

例如:我有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方法,它看起来像很多复制粘贴的代码。

可以在我的项目中如何做或如何给我一些建议吗?

2 个答案:

答案 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(用于数据访问)组成的出色的三层体系结构。可以有更多代码只是让它承担一个责任而已。