如何配置hibernate以扫描不同模块中的实体

ven*_*syv 19 java hibernate jpa maven

我有模块A和模块B,它们都有JPA注释类.模块B有一个单元测试,从A中提取几个实体.两个模块编译正常,运行时依赖项设置正常,但是当我尝试运行单元测试时出现以下错误:

java.lang.IllegalArgumentException: Unknown entity: MyClassHere
Caused by: org.hibernate.MappingException: Unknown entity: MyClassHere
Run Code Online (Sandbox Code Playgroud)

这发生在EntityManager.merge调用中.

由于模块B具有所有hibernate配置文件等,我猜它根本就没有发现我的A类是一个实体.

我尝试将以下内容添加到persistence.xml中

<exclude-unlisted-classes>false</exclude-unlisted-classes>
Run Code Online (Sandbox Code Playgroud)

在hibernate.cfg.xml中我添加了:

<property name="packagesToScan">myNamespace.*</property>
Run Code Online (Sandbox Code Playgroud)

然后:

 <property name="packagesToScan">
                <array>
                    <value>myNamespace.*</value>
                </array>
</property>
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,"属性"的内容必须匹配null.然后我尝试了:

<mapping class="myNamespace.*" />
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

编辑:我忘了提到的一件可能有意义的事情是,这两个模块被设置为单独的项目(我正在使用eclipse),所以目录结构是不同的.运行时依赖项都已正确设置,但由于.class文件最终位于不同的目录中,我认为hibernate可能不会扫描那些.

And*_*zyk 4

如果将项目配置为自动检测实体,它将仅扫描 META-INF/persistence.xml 所在的路径(默认情况下)。

\n\n

此外 :

\n\n
<exclude-unlisted-classes>false</exclude-unlisted-classes>\n
Run Code Online (Sandbox Code Playgroud)\n\n

您设置了一个额外的休眠选项:

\n\n
<property name="hibernate.archive.autodetection" value="class, hbm" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

它确定 Hibernate 实体管理器自动发现哪个元素。

\n\n

对于额外的实体(在其他 jar 中),您可以设置jar 文件对于额外的实体(在其他 jar 中),您可以在主 persistence.xml 文件中

\n\n
<persistence>\n    <persistence-unit name="myUnit">\n        ...\n        <class>foo.bar.Entity1</class>\n        <class>foo.bar.Entity2</class>\n        <jar-file>moduleB.jar</jar-file>\n        ...\n    </persistence-unit>\n</persistence>\n
Run Code Online (Sandbox Code Playgroud)\n\n

jar-file 元素指定对包含托管持久性类的打包持久性单元可见的 JAR 文件,而 class 元素显式命名托管持久性类。

\n\n

META-INF 目录中包含 persistence.xml 的 JAR 文件或目录称为持久单元的根。持久化单元的范围由持久化单元\xe2\x80\x99s 根确定。每个持久性单元必须使用持久性单元\xe2\x80\x99s 范围内唯一的名称进行标识。

\n\n

问候,安德烈\xc3\xa9

\n