我在Netbeans 7中有一个Java EE 6项目,当我在IDE中编译并启动它时运行正常。但是,当我清理并构建项目时,我得到了一个
java.lang.RuntimeException
:javax.annotation.processing.FilerException
:尝试重新创建{myclass
}类型的文件
(其中myclass
始终是JPA实体类)。
如果我在代码中更改某些内容,它会更改哪个实体类。
我不知道可能导致此错误的原因 - 任何人都可以提供一个想法。
我使用的唯一额外的lib是Velocity。
更新:我在同一个数据库中使用两个持久性单元,一个是“普通”,另一个是非事务性。我用于将事物记录到数据库的非事务性的;在每次插入日志事件后提交。
当我改变它并且只使用一个'普通'PU时,项目编译得很好。可能是两个PU干扰了eclipselink做的一些优化吗?
这是堆栈跟踪的开始:
An annotation processor threw an uncaught exception.
Consult the following stack trace for details.
java.lang.RuntimeException: javax.annotation.processing.FilerException: Attempt to recreate a file for type de.guj.contenthub.ftdts.entity.AgofEntry_
at org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor.process(CanonicalModelProcessor.java:407)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:625)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:554)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:699)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:981)
at com.sun.tools.
答案 0 :(得分:26)
使用相同的Entity类有两个持久性单元似乎确实是问题。
在我的情况下,我有一个用于查询数据的单元,另一个用于身份验证。用于身份验证的那个不需要了解我的实体类,因此在Netbeans中我必须取消选中“在MyWebServiceProject”模块中包含“包含所有实体类”。
或者添加:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
到该持久性单元的web.xml文件。
答案 1 :(得分:17)
我通过设置
解决了这个问题<property name="eclipselink.canonicalmodel.subpackage" value="foobar"/>
表示persistence.xml中的每个持久性单元。每个单元的值必须是唯一的。然后将类生成到不同的包中,例如。 com.mycompany.foo.PojoOne_
和com.mycompany.bar.PojoOne_
而非com.mycompany.PojoOne_
。
答案 2 :(得分:5)
答案是在persistence.xml文件中创建它;
<persistence-unit name="prod_PU">
<properties>
<property name="eclipselink.canonicalmodel.subpackage" value="prod"/>
</properties>
</persistence-unit>
<persistence-unit name="dev_PU">
<properties>
<property name="eclipselink.canonicalmodel.subpackage" value="dev"/>
</properties>
</persistence-unit>
例如,实体的包将生成为:
entity1.prod
entity1.dev
答案 3 :(得分:4)
看来,问题在于我在两个不同的持久性单元中使用同一个实体类。我不确定JPA是否禁止这一点,或者只是eclipselink的问题。
我发现的一个“解决方案”是复制我的实体类。不好,但现在有效。
仍然欢迎更多答案。
答案 4 :(得分:2)
我遇到了同样的问题,并且已经诊断出一点,我有一个不太理想的难看的解决方法。
我的persistence.xml中有两个持久性单元:一个用于测试,一个用于实际的生成构建。
我之所以这样做是因为如果我使用在src / tests / resources / META-INF文件夹下放置另一个persistence.xml的首选方法,则测试失败,因为生成的类被放入目标/生成-sources / test-annotations文件夹,编译后不会在类路径中的正确位置结束。
问题是,如果两者都将“exclude-unlisted-classes”设置为true,那么javac编译器会尝试在编译器期间重新创建注释类:编译,当然在第二个PU上失败,因为类已经是创建
为了使这个工作起作用,我将其中一个PU的“exclude-unlisted-classes”设置为false,这将获得生成的元类,并且测试失败(因为PU不包含所需的实体)。
然后我将标志翻转回true,然后再次运行构建。由于类已经编译,因此compile:compile不会运行,测试可以成功。
解决方法是proc:none到javac编译器args,如下所述:http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
<proc:none/>
<Xlint/>
<Xlint:-path/>
<verbose />
</compilerArguments>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
答案 5 :(得分:1)
这http://netbeans-org.1045718.n5.nabble.com/entity-class-generation-td5542168.html为我解决了这个问题。只需在NetBeans中的编译器选项中添加-proc:none即可删除该钝错错误消息。
答案 6 :(得分:0)
使用
我只需要为testPu添加一个(在内存Derby中进行jUnit测试,而不是需要实际使用Glassfish / MySQL安装)。这使得testPU与连接和子包中的运行时PU不同,但不会影响我的实体定义。
答案 7 :(得分:0)
手动包含每个持久性单元的实体类 不应该在持久性单元中包含相同的类。
答案 8 :(得分:0)
同一个persistence.xml中的两个持久性单元可能正在使用同一个实体。因此,要么删除其中一个持久性单元,要么更改两个单元访问的实体。 要执行此操作,请打开persistence.xml文件并向下滚动以查看您添加的其他单元。根据您的要求进行修改。 希望这会有所帮助。
答案 9 :(得分:0)
添加到persistence.xml文件行
真