2013-04-30 61 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