我正在尝试通过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测试,所以它似乎不是容器问题。
答案 0 :(得分:0)
确保你的MyClass_类进入你的类路径并最终进入你的jar。
使用Maven时,您可以这样做:
生成元模型:
<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>
现在您的元模型位于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>