2009-05-03 3 views
0

기존 JPA 매핑을 쉽게 확장 할 수있는 방법을 찾고 있습니다. 그 아이디어는 다음과 같습니다 :JPA 엔티티 매핑 확장

나는 EJB3 + JPA 모듈에 클래스 A가 있고 클래스 class_a에 매핑되어있는 EAR 프로젝트를 가지고 있습니다. 하지만 다른 모듈 (다른 EJB 모듈)이 ClassA (Class?)에 속성을 더 추가하는 ClassB를 갖기를 원합니다.

한 가지 방법은 class_a 테이블에 추가 필드를 추가하고 non-HQL 쿼리를 실행하여 해당 데이터를 검색하는 것입니다.

간단한 점검을했는데 두 번째 모듈 (ClassB 기준)에서 ClassA를 확장 할 수없는 것으로 보입니다. 다른 EntityManagerFactory를 사용하고 첫 번째 모듈의 일부 클래스는 두 번째 모듈에서 보이지 않으며 그 반대도 마찬가지입니다.

이미 < jar 파일 > 태그가 persistence.xml 내에 있습니다. 나는 그런 것을 필요로하지만, 그것의 사용은 첫 번째 모듈에 나열된 파일을 가져야 만한다. 존재하지 않으면 발견되지 않는다. 확장 모듈 (두 번째 모듈)과 확장 모듈 (첫 번째 모듈)에 넣을 수있는 것이 있습니까?

런타임에 JPA 매핑을 확장 할 수있는 방법이 있다면 훌륭 할 것입니다. 그런 방법이 있습니까? 내 문제에 대한 또 다른 해결책이 있습니까?

답변

0

구현 된 솔루션은 다음과 같습니다. 나는 하나 개의 항아리와 두 개의 EJB 모듈이 있습니다

  1. 항아리는 기본 하나입니다. 그것은 확장에 대한 기본 엔티티와 로컬 인터페이스를 보유 :

    @Entity 
    public class BaseEntity { 
        public long id; 
        @Id @GeneratedValue 
        public long getId() {... 
        ... other variables, getters, setters ... 
    } 
    
    @Local 
    public interface EntitiyManagerWithExtendedEntitiesInterface { 
        public EntityManager getEntityManager; 
    } 
    
  2. 첫 번째 EJB 모듈이 기본 개체를 확장하고 엔티티 관리자의 얻기 위해 EJB를 추가 할 것입니다. 이 모듈에는 persistence.xml (<jar-file>../path_to_first_jar_file.jar</jar-file> 행 포함)도 포함됩니다.

    @Entity 
    ... discriminator annotations 
    public class ExtEntity extends BaseEntity { 
        ... additional fields here 
    } 
    
    @Stateless 
    public class EntitiyManagerWithExtendedEntitiesBean implements EntitiyManagerWithExtendedEntitiesInterface { 
        @PersitenceContext 
        EntityManager em; 
        public EntityManager getEntityManager() { 
         return em; 
        } 
    } 
    
  3. 두 번째 EJB 모듈은 컴파일 만 병을 필요로하지만 (EntitiyManagerWithExtendedEntitiesInterface 인터페이스를 구현하는 것이다 EJB가 필요)를 실행하는 최초의 EJB를 필요로 EJB를해야합니다.

    @Stateless 
    public class getSomeEntity { 
        @EJB 
        EntitiyManagerWithExtendedEntitiesInterface ext; 
        EntityManager em; 
        @PostConstruct 
        public void injectEntityManager() { 
         em = ext.getEntityManager(); 
        } 
        public void ejbInterfaceMethod() { 
         ... method that uses em variable (EntityManager) 
        } 
    } 
    

응용 프로그램 서버 모듈 간의 의존성을 관리해야하고 내가 쉽게 확장 실체의 또 다른 세트를 포함하는 제 1 회 EJB 모듈을 교체 할 수 있습니다이 방법.