2013-04-30 1 views
1

우리는 공통 필드가있는 엔티티를 사용하여 일부 서비스를 작성하려고합니다. 이것을 처리하기 위해 우리가 취한 접근법은 모든 공통 필드를 가진 기본 클래스를 정의하고이 중에서 모든 다른 필드를 확장하는 것입니다.Openjpa는 별도의 jar 파일에 슈퍼 클래스로 매핑되었습니다.

기본 클래스는 매핑 된 수퍼 클래스로 정의되며 파생 클래스는 일반 엔티티입니다. 클래스 레벨에서 엔티티는 기본 클래스를 확장합니다.

모듈 식으로 유지하기 위해 우리는 공통 프로젝트 (maven 기반)와이 공통 프로젝트에 종속 된 별도 프로젝트의 엔티티에 기본 클래스를 정의했습니다.

문제는 mappedsuperclass를 식별하거나 구문 분석하지 않는다는 것입니다. 공통 맵핑을 해결할 수 없습니다.

제 질문은 여기에서 무엇을하려고하든 JPA 규칙/스펙을 준수하는지 여부입니다.

구체화 된 것과 동일한 매핑 xml에 mappedsuperclass를 정의하면 올바르게 작동합니다. 그러나 나는 피하려고하는 각 프로젝트마다 그것을 반복해야합니다.

다음은 클래스 및 매핑에 대한 일부 코드 단편입니다.

또한 여기에서 공통 맵핑 된 수퍼 클래스는 공통 기본 키 즉 v를 정의합니다. 신분증.

기본 클래스이

<persistence> 
    <persistence-unit name="test" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <mapping-file>META-INF/jpa/CommonMappings.xml</mapping-file> 
     <properties> 
      <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

이러한 기본 클래스

<entity-mappings> 
    <package>mypackage</package> 
    <mapped-superclass class="mypackage.BaseEntity"> 
     <attributes> 
      <id name="id"> 
       <column name="ID" /> 
      </id>   
      <basic name="status"> 
       <column name="STATUS"/> 
      </basic> 
      <basic name="createdDate"> 
       <column name="CREATED_DT" /> 
      </basic> 
      <basic name="createdBy"> 
       <column name="CREATED_BY" /> 
      </basic> 
      <version name="versionNumber"> 
       <column name="VERSION_NUMBER" /> 
      </version> 
     </attributes> 
    </mapped-superclass> 
</entity-mappings> 

지속성 XML의

public class BaseEntity { 
    String id; 
    String status;  
    Date createdDate; 
    String createdBy; 
    Integer versionNumber; 

    //getters and setters for these fields 
} 

매핑 XML은 별도의 용기에 포장된다. 콘크리트 엔티티

구체적인 실체

public class MyEntity extends BaseEntity { 

    String name; 
    String address; 

    //getters and setters 
} 

매핑

<entity-mappings> 
    <package>mypkg2</package> 

    <entity class="mypkg2.MyEntity" name="MyEntity">     
     <table name="MYENTITY"/> 

     <attributes>  
      <basic name="name"> 
       <column name="NAME"/>  
      </basic> 

      <basic name="address"> 
       <column name="ADDRESS"/>   
      </basic> 
     </attributes> 
    </entity> 

</entity-mappings> 

구체적인 실체

<persistence> 
    <persistence-unit name="test" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <mapping-file>META-INF/jpa/MyEntityMappings.xml</mapping-file> 
     <properties> 
      <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

편집에 대한 지속성 XML : (dkaustubh의 제안에 따라)

내 기본 엔터티에서 특수 효과를 사용하면 작동합니다. XML에서 파생 된 엔터티에 대한 매핑을 남겨 두었습니다.

그러나 매핑을 일관되게 유지하고 XML을 사용하여 매핑을 정의하려고합니다. XML 매핑이 아닌 주석과 함께 작동하는 이유는 무엇입니까?

답변

1

기본 클래스를 별도의 jar로 유지할 수 있지만 동일한 persistence.xml에 정의해야합니다.

각 매핑 xml에 대한 매핑을 반복하지 않는 것에 대한 문제가 생기면 기본 엔티티에서 주석을 더 잘 사용할 수 있습니다. 그런 식으로 매핑 XML을 반복하지 않아도됩니다.

+0

답변 해 주셔서 감사합니다. 내 기본 클래스에서 특수 효과를 사용하면 효과가 있습니다. 그러나 모든 매핑에 대해 xml을 사용하여 매핑의 일관성을 유지하려고했습니다. 왜 주석이 아닌 xml으로 작동하는지 궁금합니다. – praveenj

관련 문제