Openjpa mappedsuperclass在一个单独的jar中

时间:2013-04-30 15:42:36

标签: jpa orm openjpa mappedsuperclass

我们正在尝试使用在它们之间具有公共字段的实体构建一些服务。为了解决这个问题,我们采用的方法是定义一个包含所有公共字段的基类,并从中扩展所有其他字段。

基类定义为映射的超类,派生类是常规实体。在类级别,实体扩展基类。

为了保持模块化,我们在一个公共项目(基于maven)和单独项目中的实体中定义了基类,并依赖于这个公共项目。

问题是它没有识别/解析mappedsuperclass。它无法解决常见映射。

所以,我的问题是,无论我在这里做什么,它是否符合JPA规则/规范。

如果我在与具体映射相同的映射xml中定义mappedsuperclass,它可以正常工作。但是我必须为每个项目重复一遍,我想避免这样做。

以下是类和映射的一些代码片段。

此处还要注意,公共映射超类还定义了一个公共主键即。 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 个答案:

答案 0 :(得分:1)

您可以将基类保留在单独的jar中,但需要在同一个persistence.xml中定义它。

现在提出的问题是不重复每个映射xml的映射,您可以更好地在基础实体上使用注释。这种方式你不需要重复映射xml。