我们试图用它们之间具有共同字段的实体构建一些服务。为了处理这个问题,我们采取的方法是定义一个包含所有常用字段的基类,并从中扩展所有其他字段。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映射?
感谢您的回复。如果我在我的基类上使用注释,它会起作用。但我想保持映射一致,即对所有映射使用xml。我不知道为什么它可以与注释一起使用,而不是xml。 – praveenj 2013-04-30 20:36:09