我有一个使用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还是什么......

有谁知道这是否是该问题的有效解决方案?或者,如果还有其他一些修复我应该尝试?

谢谢 .