2016-10-20 19 views
1

Я новичок в способе кодирования JPA и многоуровневой архитектуры. В настоящее время я работаю над новым проектом: мы создаем API, в котором слой DAO используется для связи с базой данных с использованием JPQL.JPA - ленивая инициализация в слое DAO

В настоящее время я написал инструкции JPQL для получения данных из базы данных. В дополнение к этому, я также выполняю ленивые инициализации для извлечения сложных объектов. Я хочу знать, правильно ли он выполняет ленивые инициализации в слое DAO.

У меня есть еще 2 слоя перед слоем DAO, называемым слоем Engine и EJB-слоем, где у меня есть соединение с базой данных, и может выполнять ленивую инициализацию там. Я хочу знать, насколько это хороший архитектурный способ сделать это, потому что я хочу, чтобы база данных, относящаяся к материалам, шла только в слое DAO.

Но опять-таки, я застрял в точке, где я сам спорю о том, почему не делает ленивой инициализации в EJB/Engine-слое хорошим способом, так как я подключен к базе данных для выполнения операций с БД. Я думаю об этом, потому что я могу только получить необходимые данные в слое DAO, которые могут быть повторно использованы, и ленивая инициализация может выполняться в соответствии с требованиями разных классов.

Я не уверен, почему у меня есть активное соединение DB в слое Engine и EJB (я надеюсь, что это для управления транзакциями). Он нашел, что это сделано в соответствии с предложениями архитекторов, где у меня есть EJB, определенные как апатриды, и у меня есть классы уровня двигателя, имеющие подключения к базам данных в своей области.

Извините за длительный вопрос. Надеюсь, что я дал необходимые детали, чтобы ответить на вопрос.

P.S. Пожалуйста, предложите мне любую хорошую книгу или статьи, которые помогут мне решить, какой слой несет ответственность за выполнение какой задачи в идеале.

+1

Поскольку точка ленивой инициализации - отложить загрузку объектов до тех пор, пока они не понадобятся, мое мнение будет заключаться в том, чтобы сделать это в самом высоком слое, где у вас все еще есть «сеанс» или «транзакция» в области (EJB в твоем случае). Загрузка их в ваш DAO всегда будет делать это, действительно ли вы им требуете или не побеждаете цель лени. Мои $ 0,02. – kjsebastian

+0

спасибо за ответ @conscells, это нормально делать поиск базы данных в слое EJB, когда у нас есть слой DAO специально для этого? – user1901761

+0

Если вы используете Hibernate, это так же просто, как 'Hibernate.initialize (parent.getChildRelation())'. Так что-то вроде 'if (userRequestedChild) {Hibernate.initialize (...); } return parent; 'нормально делать на уровне EJB, на мой взгляд. – kjsebastian

ответ

1

Я бы сказал, что делать это в DAO - это правильная вещь. Но создайте отдельный метод для общего использования. Например, если у вас есть метод, чтобы получить отделы, как

public List<Department> getDepartments() { 
    //get departments 
    //Also fetch employees in each department here // DON'T DO 
} 

Это будет приятно иметь другой метод, специфичный для корректной выборки всех объектов и Java документ его.

public List<Department> getDepartmentsWithEmployees() { 
    //get departments 
    //Also fetch employees in each department here  
} 

Таким образом, люди будут называть правильным методом для этой цели и уменьшат вероятность любой проблемы с производительностью.

Примечание: Используйте, если возможно, функцию «Присоединить выборку».