Как реализовать универсальный дао для простой операции CRUD (Java EE, EJB-инъекции) - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время я занимаюсь рефакторингом своего кода и заметил, что могу использовать общий абстрактный класс для работы CRUD.Но, к сожалению, я застрял прямо знаю.Проблема в том, что когда я внедряю свои классы DAO в классы Service, мне нужно использовать удаленный интерфейс объекта (в моем случае Категория), см. Код ниже.

Удаленный интерфейс для универсального dao

public interface IGenericDaoRemote<T> {
void add(T t);
void remove(T t);
void update(T t);
List<T> getAll(Class<T> type);
}

Абстрактный класс универсальный дао

@Stateless
@Remote(IGenericDaoRemote.class)
@Local(IGenericDaoLocal.class)
public abstract class GenericDao<T> implements IGenericDaoLocal<T>, IGenericDaoRemote<T> {
    @PersistenceContext(name = "postgresPersistant")
    private EntityManager entityManager;

    @Override
    public void add(T t) {
        Session session = entityManager.unwrap(Session.class);
        session.save(t);
    }

    @Override
    public void remove(T t) {
        Session session = entityManager.unwrap(Session.class);
        session.delete(t);
    }

    @Override
    public void update(T t) {
        Session session = entityManager.unwrap(Session.class);
        session.update(t);
    }

    @Override
    public List<T> getAll(Class<T> type) {
        Session session = entityManager.unwrap(Session.class);
        Criteria criteria = session.createCriteria(type).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return criteria.list();
    }
}

Пример класса дао:

@Stateless
@Remote(ICategoryDaoRemote.class)
@Local(ICategoryDaoLocal.class)
public class CategoryDao extends GenericDao<Category> implements ICategoryDaoRemote, ICategoryDaoLocal {
}

Класс обслуживания:

@Stateless
@Local(ICategoryServiceLocal.class)
@Remote(ICategoryServiceRemote.class)
public class CategoryService implements ICategoryServiceRemote, ICategoryServiceLocal {

    @EJB
    private ICategoryDaoRemote categoryDao; // <-- here is a problem
.
.
.
}

Как видите, яЯ использую интерфейс ICategoryDaoRemote как тип инициализированной переменной. У меня нет доступа к общим методам dao.Я скучаю по чему-то легкому / основному?Или есть ли другой способ сделать это?

Пожалуйста, наберитесь терпения на мой английский, я старался изо всех сил!

1 Ответ

0 голосов
/ 22 мая 2018

Ди тебе действительно нужен пульт?Если вы не собираетесь предоставлять bean-компоненты отдельным приложениям, просто используйте локальные интерфейсы.

Не "единственная разница".Это огромная разница.Удаленный доступ требуется только в том случае, если вы хотите получить доступ к EJB на одном узле из другого узла в кластере.Или, если вы хотите получить доступ к EJB в одном EAR из другого EAR.

Я предлагаю следующее:

  1. Удалить удаленный интерфейс: определение интерфейса и ссылок.

  2. Определите методы, которые вам нужны влокальный интерфейс.

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