JPA - 定义@Entity对象的多个jar

Pet*_*ete 23 entity annotations hibernate jpa

我们正在以模块化的方式开发Spring,Hibernate和Maven的Web应用程序.有定义数据访问和查看特定内容的核心项目,然后有定义逻辑和实体的模块(@Entity)然后是定义控制器和视图的Web应用程序.

现在我们有一个安全模块定义了帐户和角色等安全实体,我们有一个原型模块定义了一些示例实体,如客户和订单.两者都有一个PersistenceUnit定义的内部a persistence.xml,除了PersistenceUnit名称之外几乎是空的,因为所有数据库配置都是在带有datasource.xml的web应用程序中完成的.Web应用程序应该将两个jar加载为maven依赖项.

这两个项目都可以构建好的,自动扫描所有实体并为各自的单元测试创​​建它们.如果单独添加,它们也将成功加载到Web应用程序中.

但是,只要两者同时加载,第二个将覆盖PersistenceUnit第一个,从而IllegalArgumentException : Not an entity为第一个实体创建一个.如果两个项目都有不同的持久性单元,加载Web应用程序将抛出另一个异常,说明已no single default persistence unit定义.

那么..我怎样才能@Entity在我的网络应用程序中加载所有带注释的类而不必在里面定义它们persistence.xml(比如这里),而是通过组件扫描? 似乎是一个想法,虽然我不知道如何使用和测试它...

我想我们要么必须在Web应用程序中合并所有PersistenceUnits,要么以编程方式加载所有实体.在persistence.xml中定义硬编码不是我们的选择.

Pet*_*ete 5

由于这个问题似乎仍然受到关注,我将发布我们对该问题的最新解决方案。

我们现在自动扫描所有包,而不是在任何地方使用 persistence.xml文件。

在我们的 datasource.xml 中,我们添加了这一行

<property name="packagesToScan" value="our.basepackage" />
Run Code Online (Sandbox Code Playgroud)

几乎完整的datasource.xml:

<!-- Bean definition here -->

<bean id="ourDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <!-- define connection properties -->       
</bean>


<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="ourDataSource" />
    <property name="packagesToScan" value="our.basepackage" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
            <property name="generateDdl" value="true" />
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </bean>
    </property>

</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
Run Code Online (Sandbox Code Playgroud)


sta*_*ker 4

我们使用类似的模块布局,但我们将持久性上下文放置在应用程序的 war 部分中,并将实体管理器注入到模块的 DAO 中。除了单元测试之外,这些模块没有 PU。我们这样做是因为我们担心跨越多个模块的事务可能会引起麻烦。

在 DAO 中

@PersistenceContext
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

在 persistance.xml 中,您需要使用元素登记所有实体。

<persistence-unit name="myPU">
    <class>com.Entity1</class>      
<class>com.Entity2</class>
Run Code Online (Sandbox Code Playgroud)

ETC。

  • 理论上有一个运行时自动扫描功能(取决于 JPA 提供商?我不确定),但我发现它并不总是有效。在我的公司,我编写了一个Maven插件,在构建时在war项目中运行,以根据类路径中所有注释为@Entity的类自动生成persistence.xml。 (2认同)