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

2022-09-02 10:58:44

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

java.lang.IllegalArgumentException: Unknown entity: MyClassHere
Caused by: org.hibernate.MappingException: Unknown entity: MyClassHere

这发生在 EntityManager.merge 调用中。

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

我尝试将以下内容添加到持久性中.xml

<exclude-unlisted-classes>false</exclude-unlisted-classes>

在休眠状态下.cfg.xml我添加了:

<property name="packagesToScan">myNamespace.*</property>

然后:

 <property name="packagesToScan">
                <array>
                    <value>myNamespace.*</value>
                </array>
</property>

这给了我一个错误,即“属性”的内容必须与null匹配。然后我尝试了:

<mapping class="myNamespace.*" />

我错过了什么?

编辑:我忘记提到的一件事可能很重要,那就是这两个模块被设置为单独的项目(我使用的是eclipse),所以目录结构是不同的。运行时依赖项都已正确设置,但由于.class文件最终位于不同的目录中,因此我认为hibernate可能不会扫描它们。


答案 1

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

除了 :

<exclude-unlisted-classes>false</exclude-unlisted-classes>

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

<property name="hibernate.archive.autodetection" value="class, hbm" />

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

对于额外的实体(在其他jar中),您可以在主持久性.xml文件中设置jar-file部分:

<persistence>
    <persistence-unit name="myUnit">
        ...
        <class>foo.bar.Entity1</class>
        <class>foo.bar.Entity2</class>
        <jar-file>moduleB.jar</jar-file>
        ...
    </persistence-unit>
</persistence>

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

其 META-INF 目录包含持久性.xml JAR 文件或目录称为持久性单元的根。持久性单元的范围由持久性单元的根确定。每个持久性单元必须使用持久性单元的作用域所特有的名称进行标识。

问候, 安德烈


答案 2
  • 如果您使用的是休眠/弹簧,我们可以扩展LocalSessionFactoryBean对象并扫描整个项目以识别项目中的实体类。
  • 既然您说的是两个不同的项目,请尝试编写一些构建时实用程序来解析这两个项目,并创建一个实体xml文件来解决您的问题。

推荐