我们正在尝试构建一些服务,它们之间的实体具有公共字段。为了处理这个问题,我们采用的方法是定义一个包含所有公共字段的基类,并在此基础上扩展所有其他字段。
基类定义为映射的超类,派生类是常规实体。在类级别,实体扩展基类。
为了保持它的模块化,我们在一个公共项目(基于maven)和独立项目的实体中定义了基类,这些项目依赖于这个公共项目。
问题是它不能识别/解析mapapped超类。无法解析公共映射。
所以,我的问题是,无论我在这里尝试做什么,它是否符合JPA规则/规范。
如果我在相同的映射xml中定义mapapped超类作为具体的,它工作得很好。但是我必须为每个项目重复这些,这是我想避免的。
下面是一些类和映射的代码片段。
这里还要注意,公共映射的超类也定义了一个公共主键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映射?
您可以将基类保存在单独的jar中,但需要在相同的persistence.xml中定义它。
现在回到不为每个映射xml重复映射的问题,您可以更好地在基本实体上使用注释。这样您就不需要重复您的映射xml。