我有一个使用JEE 7,JPA 2.1,Wildfly 10.1和Vaadin 8的多模块Maven Web项目,我试图通过在WAR项目中使用核心应用程序组件并导入各种其他模块来保持模块化,例如核心模块(用户/角色管理等),包括:
-
core-api(服务接口,JPA实体等)
-
核心服务(业务和持久性EJB)
-
core-ui(Vaadin UI组件,如@CDIView类,菜单构建器ejbs)
所以部署看起来像:
-
core-web.war
-
WEB-INF /
-
beans.xml(空)
-
classes /(单个Vaadin UI类,没别的)
-
lib /
-
persistence.jar(资源库只有META-INF / persistence.xml)
-
core-api.jar
-
core-services.jar
-
core-ui.jar
-
(Vaadin和其他各种图书馆 jar )
然后,当我们添加其他组件时,我们可以混合和匹配不同的部署配置,例如通过将这些api,services和ui jar文件以及如图所示的核心添加到Maven配置文件中的部署来添加记帐模块 .
我现在的问题是让JPA扫描lib文件夹中的所有jar文件,以获取persistence.xml中定义的持久性单元的实体 .
我不想明确列出所有实体类(或jar文件),因为该集将针对不同的部署进行更改 .
在persistence.xml中将exclude-unlisted-classes设置为false会在EAR中部署时产生所需的行为,但不幸的是,Vaadin在EAR中部署时效果不佳 . 它打破了很多CDI功能 .
所以我尝试在WAR的WEB-INF / classes / META-INF文件夹中包含persistence.xml,并在WAR的WEB-INF / lib文件夹中的单独库jar(在/ META-INF下) ,我发现让它工作的唯一方法是在persistence.xml文件中包含一个空的 <jar-file>
元素 .
<persistence-unit name="my.persistence.unit" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/ApplicationDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<jar-file></jar-file>
</persistence-unit>
persistence.xml验证器在Eclipse中抱怨这一点,但是当我部署到Wildfly时它可以工作;我的实体很好地从数据库中被发现和检索 .
但我只看到在一个地方提到的这个小技巧,并且找不到任何关于它的文件,所以当我不知道我们是否可能依赖时,我犹豫是否说“我们已经修好了” Hibernate中的一个bug还是什么......
有谁知道这是否是该问题的有效解决方案?或者,如果还有其他一些修复我应该尝试?
谢谢 .