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可能不会扫描那些.
如果将项目配置为自动检测实体,它将仅扫描 META-INF/persistence.xml 所在的路径(默认情况下)。
\n\n此外 :
\n\n<exclude-unlisted-classes>false</exclude-unlisted-classes>\nRun Code Online (Sandbox Code Playgroud)\n\n您设置了一个额外的休眠选项:
\n\n<property name="hibernate.archive.autodetection" value="class, hbm" />\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n\njar-file 元素指定对包含托管持久性类的打包持久性单元可见的 JAR 文件,而 class 元素显式命名托管持久性类。
\n\nMETA-INF 目录中包含 persistence.xml 的 JAR 文件或目录称为持久单元的根。持久化单元的范围由持久化单元\xe2\x80\x99s 根确定。每个持久性单元必须使用持久性单元\xe2\x80\x99s 范围内唯一的名称进行标识。
\n\n问候,安德烈\xc3\xa9
\n