Я новичок в способе кодирования JPA и многоуровневой архитектуры. В настоящее время я работаю над новым проектом: мы создаем API, в котором слой DAO используется для связи с базой данных с использованием JPQL.JPA - ленивая инициализация в слое DAO
В настоящее время я написал инструкции JPQL для получения данных из базы данных. В дополнение к этому, я также выполняю ленивые инициализации для извлечения сложных объектов. Я хочу знать, правильно ли он выполняет ленивые инициализации в слое DAO.
У меня есть еще 2 слоя перед слоем DAO, называемым слоем Engine и EJB-слоем, где у меня есть соединение с базой данных, и может выполнять ленивую инициализацию там. Я хочу знать, насколько это хороший архитектурный способ сделать это, потому что я хочу, чтобы база данных, относящаяся к материалам, шла только в слое DAO.
Но опять-таки, я застрял в точке, где я сам спорю о том, почему не делает ленивой инициализации в EJB/Engine-слое хорошим способом, так как я подключен к базе данных для выполнения операций с БД. Я думаю об этом, потому что я могу только получить необходимые данные в слое DAO, которые могут быть повторно использованы, и ленивая инициализация может выполняться в соответствии с требованиями разных классов.
Я не уверен, почему у меня есть активное соединение DB в слое Engine и EJB (я надеюсь, что это для управления транзакциями). Он нашел, что это сделано в соответствии с предложениями архитекторов, где у меня есть EJB, определенные как апатриды, и у меня есть классы уровня двигателя, имеющие подключения к базам данных в своей области.
Извините за длительный вопрос. Надеюсь, что я дал необходимые детали, чтобы ответить на вопрос.
P.S. Пожалуйста, предложите мне любую хорошую книгу или статьи, которые помогут мне решить, какой слой несет ответственность за выполнение какой задачи в идеале.
Поскольку точка ленивой инициализации - отложить загрузку объектов до тех пор, пока они не понадобятся, мое мнение будет заключаться в том, чтобы сделать это в самом высоком слое, где у вас все еще есть «сеанс» или «транзакция» в области (EJB в твоем случае). Загрузка их в ваш DAO всегда будет делать это, действительно ли вы им требуете или не побеждаете цель лени. Мои $ 0,02. – kjsebastian
спасибо за ответ @conscells, это нормально делать поиск базы данных в слое EJB, когда у нас есть слой DAO специально для этого? – user1901761
Если вы используете Hibernate, это так же просто, как 'Hibernate.initialize (parent.getChildRelation())'. Так что-то вроде 'if (userRequestedChild) {Hibernate.initialize (...); } return parent; 'нормально делать на уровне EJB, на мой взгляд. – kjsebastian