JPA 2 元模型 是 JPA 2 中类型安全查询的基础。生成的类允许您使用静态字段引用来引用实体属性,而不是字符串。(元模型类是实体类的完全限定类名后跟一个下划线(_))。

听起来很有前景,但许多使用 Maven 的人在使用生成和编译元模型时遇到了困难。《Hibernate JPA 2 Metamodel Generator 指南》提供了一些解决方案。我找到了另一个,看起来更优雅。

让我们先回顾一下问题

  1. Maven 在编译阶段编译类
  2. Java 6 编译器允许注解处理器挂钩其中
  3. 注解处理器被允许生成 Java 源文件(JPA 2 元模型就是这种情况)
  4. Maven 不会执行一个额外的编译步骤来编译注解处理器生成的 Java 源文件

我发现,在生成源代码阶段,可以使用 Maven 编译器插件来运行注解处理器!这实际上成为了一个代码生成步骤。然后,只有一个缺点。令人难以置信的是,Maven 没有内置的方式来编译生成的源文件。因此,我们需要添加一个额外的插件(build-helper-maven-plugin),它只是添加了一个额外的源文件夹(我真的无法相信编译器插件没有提供这个功能)。在编译阶段,我们可以禁用注解处理器来加快编译速度并避免第二次生成元模型。

以下是配置,供您复制粘贴。将其添加到您的 POM 中的<plugins>部分。

<!-- Compiler plugin enforces Java 1.6 compatibility and controls execution of annotation processors -->
<plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>2.3.1</version>
   <configuration>
      <source>1.6</source>
      <target>1.6</target>
      <compilerArgument>-proc:none</compilerArgument>
   </configuration>
   <executions>
      <execution>
         <id>run-annotation-processors-only</id>
         <phase>generate-sources</phase>
         <configuration>
            <compilerArgument>-proc:only</compilerArgument>
            <!-- If your app has multiple packages, use this include filter to
                 execute the processor only on the package containing your entities -->
            <!--
            <includes>
               <include>**/model/*.java</include>
            </includes>
            -->
         </configuration>
         <goals>
            <goal>compile</goal>
         </goals>
      </execution>
   </executions>  
</plugin>         
<!-- Build helper plugin adds the sources generated by the JPA 2 annotation processor to the compile path -->
<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>build-helper-maven-plugin</artifactId>
   <version>1.5</version>
   <executions>      
      <execution> 
         <phase>process-sources</phase>
         <configuration>
            <sources>
               <source>${project.build.directory}/generated-sources/annotations</source>
            </sources>
         </configuration>
         <goals>
            <goal>add-source</goal>
         </goals>
      </execution>
   </executions>
</plugin>

元模型源文件生成到target/generated-sources/annotations目录。

请注意,如果您在Java包中引用了元模型,您需要过滤注解处理器,使其仅在包含实体类的包上运行。

我们将在Weld架构的1.0.1.Beta1版本中实现此方法,该版本即将推出。

附加材料:Eclipse配置

在此期间,我还可以向您展示如何在Eclipse中启用JPA 2元模型生成。(Max可能会纠正我。他是Eclipse工具的权威人士,所以请听他的意见)。

首先,将以下依赖项添加到您的POM中

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-jpamodelgen</artifactId>
   <version>1.0.0.Final</version>
   <scope>provided</scope>
</dependency>

然后,在项目根目录中填充以下内容的.factorypath文件

<factorypath>
    <factorypathentry kind="PLUGIN" id="org.eclipse.jst.ws.annotations.core" enabled="true" runInBatchMode="false"/>
    <factorypathentry kind="VARJAR" id="M2_REPO/org/hibernate/hibernate-jpamodelgen/1.0.0.Final/hibernate-jpamodelgen-1.0.0.Final.jar" enabled="true" runInBatchMode="false"/>
    <factorypathentry kind="VARJAR" id="M2_REPO/org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.0.Final/hibernate-jpa-2.0-api-1.0.0.Final.jar" enabled="true" runInBatchMode="false"/>
</factorypath>

在Eclipse中刷新项目。现在右键单击项目并选择

Properties > Java Compiler > Annotation Processing

启用项目特定设置并启用注解处理。当提示构建项目时,按OK并再次按OK。现在,Eclipse还应生成您的JPA 2元模型。

享受类型安全的查询!


返回顶部