我们正在以非常模块化的方式使用 Spring、Hibernate 和 Maven 开发 Web 应用程序。有定义数据访问和查看特定内容的核心项目,然后有定义逻辑和实体的模块(@Entity
)然后是定义控制器和视图的 Web 应用程序。
现在我们有一个定义安全实体(如帐户和角色)的安全模块,还有一个原型模块定义一些示例实体(如客户和订单)。两者都有一个PersistenceUnit
定义在一个内部persistence.xml
除了 PersistenceUnit 名称之外,它几乎是空的,因为所有数据库配置都是在 Web 应用程序中使用 datasource.xml 完成的。 Web 应用程序应该将这两个 jar 作为 Maven 依赖项加载。
这两个项目都将构建良好,自动扫描所有实体并为各自的单元测试创建它们。如果单独添加,它们也将成功加载到网络应用程序中。
但是,一旦两者同时加载,第二个将覆盖PersistenceUnit
第一个,从而创建一个IllegalArgumentException : Not an entity
对于第一个实体中的所有实体。如果两个项目都有不同的持久性单元,则加载 Web 应用程序将引发另一个异常:no single default persistence unit
定义的。
那么..我怎样才能得到所有@Entity
带注释的类可以加载到我的网络应用程序中,而无需在persistence.xml
(like here http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence-units.html)而是通过组件扫描?This http://forum.springsource.org/showthread.php?61763-Problems-with-JPA-and-multiple-persistence-units似乎是一个想法,虽然我不知道如何使用和测试它......
我认为我们要么必须合并 Web 应用程序内的所有 PersistenceUnit,要么以编程方式加载所有实体。我们无法选择在 persistence.xml 中硬编码地定义它们。
由于这个问题似乎仍然受到关注,我将发布该问题的最新解决方案。
我们现在自动扫描所有包而不是使用 persistence.xml任何地方的文件。
在我们的 datasource.xml 中,我们添加了这一行
<property name="packagesToScan" value="our.basepackage" />
几乎完整的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" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)