Ond*_*žka 38 configuration entity entities hibernate jpa-2.0
我有一个maven构建的基于CDI的Java SE应用程序,它有一个核心模块和其他模块.
核心有persistence.xml
一些实体.模块有其他实体.
如何将实体添加到持久性单元的聚光灯下?
我已阅读Hibernate手册,http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html#setup-configuration-packaging
我也看过这些问题
我正在寻找一个解决方案,其中Hibernate将扫描所有加载的类,或者,将从其他罐中获取一些配置文件(例如CDI所做的beans.xml
).
我的应用程序不使用Spring.我不坚持可移植性 - 我会坚持使用Hibernate.
persistence.xml
并向其添加类?EntityManagerFactory
可以在创建后添加@Entity类吗?更新:我发现org.?hibernate.?ejb.?Ejb3Configuration
:
public Ejb3Configuration configure(String persistenceUnitName, Map integration)
Run Code Online (Sandbox Code Playgroud)
Adr*_*hum 11
有几种方法可以解决它:
如我在persistence.xml中需要<class>元素中所述?,你可以设置hibernate.archive.autodetection
属性,Hibernate应该能够从classpath中查找所有带注释的类.但是,这不符合JPA规范.
如果您正在使用Spring,从Spring 3.1.2(或者甚至可能更早一点)开始LocalContainerEntityManagerFactoryBean
,您可以定义packageToScan
哪个将要求LocalContainerEntityManagerFactoryBean
在类路径中扫描以查找所有带注释的类.同样,不符合JPA规范.
我使用Maven作为构建工具.几年前,我编写了一个小插件,它将在构建过程中生成persistence.xml.该插件将从构建类路径扫描以找出所有带注释的类,并在生成的persistence.xml中列出它们.这是最乏味的,但结果是JPA规范兼容.一个缺点(不适用于我认为的大多数人)是查找发生在构建时,而不是运行时.这意味着如果您的应用程序仅在部署/运行时但不是构建时提供实体JAR,则此方法不起作用.
Ejb3Configuration已在4.3.0中删除.如果您不想创建Hibernate的Integrator,则可以使用该属性hibernate.ejb.loaded.classes
.
properties.put(org.hibernate.jpa.AvailableSettings.LOADED_CLASSES, entities);
Persistence.createEntityManagerFactory("persistence-unit", properties);
Run Code Online (Sandbox Code Playgroud)
哪里entities
是List<Class>
实体类的.
小智 6
我有一个稍微不同的设置,我将persistence.xml放在WAR文件中,但是它的一些依赖包括@Entity注释被归类为包含在持久性单元中.
我已经使用Maven解决了我的问题,有点像#3中描述的Adrian Shum,但是使用该元素来包含要扫描的jar用于@Entity注释.
我为my-web/pom.xml添加了一个属性,用于包含额外实体的每个依赖项.我所有的罐子都是Maven多项目构建的一部分,所以对我来说它看起来像.
<properties>
<common.jar>common-${project.version}.jar</common.jar>
<foo.jar>foo-${project.version}.jar</foo.jar>
</properties>
Run Code Online (Sandbox Code Playgroud)
之后我将以下内容添加到persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" ... >
<persistence-unit name="primary">
<jta-data-source>java:jboss/datasources/mysource</jta-data-source>
<jar-file>lib/${common.jar}</jar-file>
<jar-file>lib/${foo.jar}</jar-file>
...
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
最后,我在web/pom.xml中配置maven-resource-plugin,将persistence.xml中的$表达式替换为POM中设置的属性
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/persistence.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/persistence.xml</exclude>
</excludes>
</resource>
</resources>
...
</build>
Run Code Online (Sandbox Code Playgroud)
我也遇到过同样的问题,不幸的是没有简单的解决方案,基本上看起来 JPA 并不是设计用于这种方式的。解决方案之一是每个顶级项目(应用程序)只有一个persistence.xml。它有点类似于 log4j 配置。persistence.xml 必须列出所有类(使用<class>
),或者,如果它不是 Java SE 应用程序,则列出 jar 文件(使用<jar-file>
应用程序使用的 jar 文件(使用 )。通过这种方式,您可以将多个模块(jar)中的实体放入单个持久性单元中。缺点很明显:您必须在一个文件中列出所有内容。
编辑:我(可能)找到了另一个使用 XML 映射文件的解决方案,请在此处查看:多个 jars,单个持久单元解决方案?
归档时间: |
|
查看次数: |
29449 次 |
最近记录: |