2012-04-22 5 views
1

현재 Java-EE6 (GlassFish 3.1.2, MySQL Server 5.1 및 Netbeans 7.1.1)을 사용하는 3 계층 응용 프로그램을 작성 중입니다.Java-EE6 : 계층간에 전달되는 @Entity를 설계하는 방법은 무엇입니까?

  • 엔터프라이즈 응용 프로그램/EJB의 :
  • 자바 클래스 라이브러리 데이터베이스에 엔티티를 제어하는 ​​외관 :

    이 프로젝트는 현재 3 개 프로젝트로 구성 데이터베이스 모델을 대표하는 @Entity 주석 클래스 (이 프로젝트 서버 자원의 JNDI 룩업 (EJB의 원격 액세스)

: 계층 사이의 엔티티 인스턴스)
  • J2SE 지방-Client를 교환하기 위해 EE-응용 프로그램과 지방 클라이언트에서 공유

    엔티티를 생성/수정/삭제할 때 클라이언트의 GUI를 업데이트하기 위해 각 클라이언트가 시작시에 가입하고 EJB 컨테이너의 메시지 구동 Bean이 게시자 역할을하는 Topic을 구현하여 JMS를 사용하기로 결정했습니다. 그때 가입 한 고객에게 업데이트 메시지를 게시해야 엔티티 객체 라이프 사이클 리스너 (등 @PostUpdate를) 부착

    • :

      는 지금은 다음과 같은 큰 문제에 직면하고 있습니다. 엔티티 클래스는 class-lib 프로젝트에 있지만 게시자는 EE-app에 있습니다. 문제는 EE-app가 class-lib 프로젝트를 참조하지만 순환 프로젝트 참조가 허용되지 않으므로 그 반대가 아니라는 점입니다. 따라서 엔티티 클래스의 라이프 사이클 콜백 메소드에는 EE-app의 메시지 구동 게시자 Bean에 대한 참조가 없습니다.

    더 많은 디자인 관련 질문 &이 기본적으로 Java-EE6을 사용하여 3 계층 응용 프로그램을 설계하는 올바른 방법인지 묻는 질문이 있습니까?

    가능하면 복잡성을 낮추려면 응용 프로그램이 과도한 네트워크 트래픽을 발생시키지 않도록 가능한 한 DTO/DAO를 피하십시오.

    미리 알려 주셔서 감사합니다.

  • 답변

    0

    @Entity 개체를 모든 레이어간에 직접 전달하여 문제를 해결했습니다. 정적 위빙 (japana-link를 jpa 프로 바이더로 사용)을 활성화함으로써 무거운 관계에 대해 게으른 페칭을 사용할 수있었습니다. 클라이언트 측에서만 중요한 관계를 가져 오기 위해로드 그룹을 사용하여 네트워크를 통해 직렬화되기 전에 미리 가져와야하는 지연 관계를 정의하여 엔터티 관리자에서 엔터티를 분리합니다. 엔티티를 다시 서버에 보내려면 엔티티를 관리 상태로 되돌리기 위해 서버 측 정면에서 EntityManager.merge (T)를 사용하기 만하면됩니다. 이 디자인은 매우 복잡한 데이터 계층 구조에서도 훌륭하게 작동합니다.

    +0

    EJB 서버 컨텍스트 외부에서 @Entities를 씩 클라이언트에 보내겠습니까? 관계가 프록시이기 때문에이 엔티티는 직렬화 할 수 없습니다. 어떻게 DTO없이이 작업을 할 수 있습니까? – edutesoy