2013-04-30 60 views
1

我們試圖用它們之間具有共同字段的實體構建一些服務。爲了處理這個問題,我們採取的方法是定義一個包含所有常用字段的基類,並從中擴展所有其他字段。Openjpa mappedsuperclass在一個單獨的jar中

基類定義爲映射超類,派生類是常規實體。在類級別,實體擴展基類。

爲了保持它的模塊化,我們已經在普通項目中定義了基類(基於maven),並且在依賴於這個公共項目的單獨項目中定義了基類。

問題是它不能識別/分析映射的超類。它無法解析通用映射。

所以,我的問題是,無論我在這裏做什麼,它是否符合JPA規則/規範。

如果我在與具體映射相同的映射xml中定義mappedsuperclass,則它工作正常。但是,我必須對每個項目都重複一遍,這是我想避免的。

下面是類和映射的一些代碼片段。

此處還要注意,通用映射超類還定義了一個公共主鍵即viz。 ID。

基類:

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

    //getters and setters for these fields 
} 

映射XML基類

<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此

<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> 

這些被包裝在單獨的罐中。

混凝土實體

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> 

的持久性XML爲混凝土實體

<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> 

編輯:(基於dkaustubh的建議)

它適用於我在我的基本實體上使用註釋。我已經將派生實體的映射留在了XML中。

但是,我想保持映射一致,並希望使用XML來定義它。爲什麼它可以使用註釋而不是XML映射?

回答

1

您可以將基類保存在單獨的jar中,但您需要在同一個persistence.xml中定義它。

現在來談談不重複每個映射xml映射的問題,您可以更好地在您的基礎實體上使用註釋。這種方式你不需要重複你的映射xml。

+0

感謝您的回覆。如果我在我的基類上使用註釋,它會起作用。但我想保持映射一致,即對所有映射使用xml。我不知道爲什麼它可以與註釋一起使用,而不是xml。 – praveenj 2013-04-30 20:36:09