2014-11-22 26 views
0

我正在使用Spring和OpenJPA开展项目。我有一个用例,我需要在不同的项目/ maven模块中创建相同数据源的实体。OpenJPA 2.x上的实体增强

方法1:

我有具有含有具有特定功能的实体组两个模块Maven项目核心实体。

模块A - Enitity1,Enitity2,Enitity3 模块B - Enitity4,Enitity5,Enitity6

我具有用于每个组的实体的创建单独的持久化单元和持久性XML。当实体在其各自的Maven模块中得到增强时,它可以正常工作。

方法2: 在这种方法中我有实体如上但唯一的不同独立的模块是,我使用单个持久性单元两者组实体。我已经在两个模块中添加了用于增强实体的openjpa-maven插件。 在这种情况下,当使用maven插件增强实体时,它会给出例外情况,表明在运行时在模块A中找不到实体的元数据。 是因为当实体增强,在模块A的实体莫名其妙的元数据丢失在runtime.This问题不附带模块B.实体

我解决此问题几个问题:

1)建议对同一数据源有多个持久性单元(如方法1中所做的那样)?

2)有什么办法可以增强单个持久化单元中的实体和不同的Maven模块?

3)除了使用eclipse和maven插件之外,实体增强的其他方法是否有所增强?

下面是在每个模块的pom.xml的插件:

<build> 
     <plugins> 

      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>openjpa-maven-plugin</artifactId> 
       <version>1.1</version> 
       <configuration> 
        <includes>**/entity/**/*.class</includes> 
        <addDefaultConstructor>true</addDefaultConstructor> 
        <enforcePropertyRestrictions>true</enforcePropertyRestrictions> 
        <persistenceXmlFile>${basedir}/src/main/resources/META-INF/moduleApersistence.xml</persistenceXmlFile> 
       </configuration> 
       <executions> 
        <execution> 
         <id>enhancer</id> 
         <phase>process-classes</phase> 
         <goals> 
          <goal>enhance</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <dependency> 
         <groupId>org.apache.openjpa</groupId> 
         <artifactId>openjpa</artifactId> 
         <version>${openjpa.version}</version> 
        </dependency> 
       </dependencies> 
      </plugin> 
     </plugins> 
     <pluginManagement> 
      <plugins> 
       <!--This plugin's configuration is used to store Eclipse m2e settings 
        only. It has no influence on the Maven build itself. --> 
       <plugin> 
        <groupId>org.eclipse.m2e</groupId> 
        <artifactId>lifecycle-mapping</artifactId> 
        <version>1.0.0</version> 
        <configuration> 
         <lifecycleMappingMetadata> 
          <pluginExecutions> 
           <pluginExecution> 
            <pluginExecutionFilter> 
             <groupId> 
              org.apache.openjpa 
             </groupId> 
             <artifactId> 
              openjpa-maven-plugin 
             </artifactId> 
             <versionRange> 
              [2.2.0,) 
             </versionRange> 
             <goals> 
              <goal>enhance</goal> 
             </goals> 
            </pluginExecutionFilter> 
            <action> 
             <ignore></ignore> 
            </action> 
           </pluginExecution> 
           <pluginExecution> 
            <pluginExecutionFilter> 
             <groupId> 
              org.codehaus.mojo 
             </groupId> 
             <artifactId> 
              cobertura-maven-plugin 
             </artifactId> 
             <versionRange> 
              [2.5.2,) 
             </versionRange> 
             <goals> 
              <goal>instrument</goal> 
             </goals> 
            </pluginExecutionFilter> 
            <action> 
             <ignore></ignore> 
            </action> 
           </pluginExecution> 
          </pluginExecutions> 
         </lifecycleMappingMetadata> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 

回答

0

它通常是一个好主意,以组功能概念成模块。遵循这个想法,描述ModuleA的功能概念的类是包含在ModuleA中的,而不是根据它们的技术实现来传播。

  1. 单个或多个持久性单元:它取决于您的应用程序和您的域对象之间的依赖关系。每个持久性单元都有自己的第一级缓存(更多here)。总结在一行中,这意味着代表Entity4的行将被映射到相同事务中的不同实例,具体取决于查询哪个持久性单元。例如entityManager.find(Entity4.class, 3L)ModuleB将返回一个不同的实例,因为实体3和实体4位于不同的持久性单元中,所以将返回ModuleA中中的OneToMany中得到的实例。

    一般而言,您保留在不同持久性单元中彼此无关的实体,以及在相同持久性单元中以某种方式关联的实体。我的建议是保持一个持久性单元,除非你确信你会从几个中受益。保持简单,尽可能避免复杂性。

  2. 是的。把你的persistence.xml放在一个单独的模块中。在父pom中配置openjpa-maven-plugin,然后将其加载到包含实体的模块中。

父 - pom.xml中:

<pluginManagement><plugins> 
 
    ... 
 
    <plugin> 
 
     <groupId>org.apache.openjpa</groupId> 
 
     <artifactId>openjpa-maven-plugin</artifactId> 
 
     <version>${openjpa-maven-plugin.version}</version> 
 
     <executions> 
 
      <execution> 
 
       <id>enhancer</id> 
 
       <phase>process-classes</phase> 
 
       <goals> 
 
        <goal>enhance</goal> 
 
       </goals> 
 
      </execution> 
 
     </executions> 
 
     <configuration> 
 
      <addDefaultConstructor>true</addDefaultConstructor> 
 
      <enforcePropertyRestrictions>true</enforcePropertyRestrictions> 
 
      <persistenceXmlFile>${project.parent.basedir}/module-infra/src/main/resources/META-INF/persistence.xml</persistenceXmlFile> 
 
     </configuration> 
 
     <dependencies> 
 
      <dependency> 
 
       <groupId>org.apache.openjpa</groupId> 
 
       <artifactId>openjpa</artifactId> 
 
       <version>${openjpa.version}</version> 
 
      </dependency> 
 
     </dependencies> 
 
    </plugin>

ModuleA和ModuleB的pom.xml:

<build><plugins> 
 
    <plugin> 
 
     <groupId>org.apache.openjpa</groupId> 
 
     <artifactId>openjpa-maven-plugin</artifactId> 
 
     <configuration> 
 
      <includes> 
 
       **/*SomeEntity.class 
 
      </includes> 
 
     </configuration> 
 
    </plugin>

模块下文/../的persistence.xml(构成非JTA数据源在OSGi容器中)

<?xml version="1.0" encoding="UTF-8"?> 
 
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" 
 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
 
       http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
 
       version="2.0"> 
 

 
     <persistence-unit name="yourPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
 
      <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
 

 
      <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=somedb)</non-jta-data-source> 
 

 
      <class>com.example.modulea.Entity1</class> 
 
      <class>com.example.moduleb.Entity3</class> 
 

 
      <exclude-unlisted-classes>true</exclude-unlisted-classes> 
 

 
      <properties> 
 
       <property name="openjpa.TransactionMode" value="local"/> 
 
       <property name="openjpa.ConnectionFactoryMode" value="local"/> 
 
       <property name="openjpa.Log" value="slf4j"/> 
 
      </properties> 
 
     </persistence-unit> 
 
    </persistence>

  • 不,我知道的。但maven插件应该足够。我从来没有使用过Eclipse插件。