2016-10-20 11 views
1

저는 JPA와 다중 계층 아키텍처 코딩 방법을 처음 사용합니다. 저는 현재 새로운 프로젝트를 진행하고 있습니다. DAO 레이어가 JPQL을 사용하여 데이터베이스와 통신하는 데 사용되는 API를 만들고 있습니다.JPA - DAO 계층의 지연 초기화 (Reazy Initialization)

현재 데이터베이스에서 데이터를 가져 오기 위해 JPQL 문을 작성했습니다. 그 외에도 복잡한 객체를 검색하기 위해 지연 초기화를 수행하고 있습니다. DAO 계층에서 지연 초기화를 수행하는 것이 올바른지 알고 싶습니다.

엔진 계층과 EJB 계층이라고하는 DAO 계층 전에 두 개의 계층이 더 있습니다. 여기서 데이터베이스 연결을 활성화하고 거기에서 지연 초기화를 수행 할 수 있습니다. DAO 계층에만있는 데이터베이스와 관련된 데이터베이스를 원하기 때문에 그렇게하는 것이 좋은 아키텍처 방식인지 알고 싶습니다.

그러나 다시 한 번 나는 DB 작업을 수행하기 위해 데이터베이스 연결을 활성화 한 상태에서 EJB/Engine 계층에서 지연 초기화를 수행하지 않는 이유에 대해 스스로 논쟁하는 시점에 처진다. 내가 재사용 할 수있는 DAO 계층에서 필요한 데이터를 검색 할 수 있고 게으른 초기화를 다른 클래스에서 요구하는대로 수행 할 수 있기 때문에이 방법을 생각하고있다.

엔진 연결과 EJB 계층에서 DB 연결이 활성화 된 이유가 확실하지 않습니다. 트랜잭션 관리를 위해이 트랜잭션이 필요합니다. EJB가 무국적으로 정의되어 있고 해당 범위에 데이터베이스 연결이있는 엔진 수준 클래스가있는 건축가 제안에 따라 완료되었음을 알게되었습니다.

죄송합니다. 희망하는 질문에 답하기 위해 필요한 세부 사항을 알려 주셨으면합니다.

P. 제가 어떤 계층이 어떤 작업을 이상적으로 수행 할 책임이 있는지 결정하는 데 도움이되는 좋은 책이나 기사를 제안 해주십시오.

+1

지연 초기화의 요점은 필요할 때까지 엔티티의 로딩을 지연하는 것이므로 제 생각에는 여전히 범위 내에 'Session'또는 'Transaction'이있는 레이어 중 가장 높은 계층에서 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 
} 

같은 부서를 얻을 수있는 방법이 있다면.

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

사람들은 필요에 맞게 올바른 방법을 호출하고 성능 문제가 발생할 가능성을 줄입니다.

참고 : 가능한 경우 결합 가져 오기를 사용하십시오.