使用JPA @StaticMetamodel类没有本地persistence.xml? (远程EJB)

时间:2014-06-26 19:46:42

标签: java hibernate maven jpa

我正在尝试通过EJB远程使用JPA服务和EasyCriteria的分离条件生成器(非常酷的功能),它不需要EntityManager来编写查询。

EasyCriteria<MyTable> myCriteria = EasyCriteriaFactory.createEasyCTO();
myCriteria.leftJoin(MyTable_.otherTable.getName());

基本上,我不希望EJB客户端服务器知道数据库,而不是模式(因此没有persistence.xml或数据源。)但我想使用Metamodel来强制执行这些查询的模式名称安全性。模式(实体和元模型)通过Maven依赖项导入。

<dependency>
    <groupId>my.service</groupId>
    <artifactId>my-schema</artifactId>
    <version>1.1.1-SNAPSHOT</version>
</dependency>

此jar包含JPA实体和@StaticMetamodel类,例如

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(MyClass.class)
public abstract class MyClass_ {
    public static volatile SingularAttribute<MyClass, String> descr;

}

然而,虽然MyClass(实体)和MyClass_(元模型)在编译时可用,但元模型MyClass_在运行时抛出NPE。我的调试器说“Class not loaded”,这显然很奇怪。这些类有什么特别之处会导致它们无法加载吗?我还需要其他依赖吗?

这甚至是JUnit测试,所以它似乎不是容器问题。

1 个答案:

答案 0 :(得分:0)

确保你的MyClass_类进入你的类路径并最终进入你的jar。

使用Maven时,您可以这样做:

  1. 生成元模型:

    <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <executions>
            <execution>
                <id>process</id>
                <goals>
                    <goal>process</goal>
                </goals>
                <phase>generate-sources</phase>
                <configuration>
                    <outputDirectory>${basedir}/target/generated-sources/java/</outputDirectory>
                    <processors>
                        <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
                        </processor>
                    </processors>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  2. 现在您的元模型位于target / generated-sources / java / so中,以便将它们添加到您需要的src / main / java中:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
          <execution>
               <id>add-source</id>
               <phase>generate-sources</phase>
               <goals>
                  <goal>add-source</goal>
               </goals>
               <configuration>
                   <sources>
                        <source>${basedir}/target/generated-sources/java</source>
                   </sources>
               </configuration>
          </execution>
        </executions>
    </plugin>