Могу ли я использовать универсальный метод для доступа к данным из разных объектов в спящем режиме - PullRequest
0 голосов
/ 18 июня 2019

Например: у меня есть User.class и Post.Class. Я хочу получить все строки из этой таблицы в режиме гибернации.Это делается с

TypedQuery<Post> query = SessionFactory.getCurrentSession().createQuery("from Post");

Также у меня есть слой дао, UserDao и PostDao.и у меня есть абстрактный класс CrudDao с такими методами, как:

public abstract class CrudDao<T> {


    @Transactional
    public void save(T entity) {
        SessionFactory.getCurrentSession().save(entity);
    }
}

Так что мой пользователь и пост-дао просто расширяют этот crudDao, и мне не нужно писать для них метод сохранения.Когда я хочу получить все строки, мне нужно написать «из MyEntitie».Но я хочу сделать этот метод также абстрактным, поэтому мне не нужно писать его несколько раз для каждого дао.Но я не могу написать «из 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);

И мне сказали, что мой сервис не должен знать о моей сущности, и мой вызов dao в службе должен быть PostDao.getAll(); И если я делаю так, то мне нужно написать метод getAll в каждом дао, и этовыглядит как много скопированного кода.

Можете ли вы дать мне несколько советов о том, как это сделать или как вы делаете это в своих проектах?

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

На мой взгляд, универсальный DAO - это антипаттерн.Spring предоставляет вам отличную трехуровневую архитектуру, состоящую из @Controller (для mvc и отдыха), @Service (для повторного использования функциональности) и @Repository (для доступа к данным).Хорошо иметь немного больше кода, чтобы оставить его с одной ответственностью.

0 голосов
/ 18 июня 2019

Что я узнал из ответа 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);
}
}

Так что вам нужнотолько написать конструктор, который вызывает конструктор суперкласса в вашем дочернем Дао, который расширяет универсальный Дао.Как:

public class PostCommentDao extends CrudDao<PostComment> {

    public PostCommentDao(){
        super(PostComment.class);
    }
}

И теперь все работает от универсального дао!

Как сказал Танос: небольшая цена за спасение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...