【发布时间】:2018-05-11 15:28:56
【问题描述】:
我是 Spring 新手,正在尝试在 Weblogic 12c 上集成 Spring Data、EclipseLink 和 EJB。
我想使用 CDI 将 Spring Data Repository 注入到无状态 EJB 中,因此我遵循 Spring Data CDI 集成说明并成功使用了单个持久性单元。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpd.misc.cdi-integration
由于应用需要两个持久化单元来连接两个不同的数据库,所以我在persistence.xml中配置了两个不同名字的持久化单元。
问题来了:如何创建两个 Spring Data 存储库,以便 RepositoryA 使用持久性单元 A 和 RepositoryB 使用持久性单元 B?
persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="PRIMARY_PU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/EMP_DS</jta-data-source>
<class>com.smec.eis.example.springbooteval.model.Employee</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
</persistence-unit>
<persistence-unit name="SECONDARY_PU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/HR_DS</jta-data-source>
<class>com.smec.eis.example.springbooteval.model.Job</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
</persistence-unit>
</persistence>
主要 CDI 生产者:
public class EntityManagerFactoryProducer {
@Produces
@ApplicationScoped
public EntityManagerFactory createEntityManagerFactory() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PRIMARY_PU");
return emf;
}
public void close(@Disposes EntityManagerFactory entityManagerFactory) {
entityManagerFactory.close();
}
@Produces
@Dependent
public EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory.createEntityManager();
}
public void close(@Disposes EntityManager entityManager) {
entityManager.close();
}
}
【问题讨论】:
-
为什么要在 Java EE 容器中使用 Spring Data?看看 DeltaSpike:deltaspike.apache.org/documentation/data.html DeltaSpike 是完全适合 Java EE 的 CDI 扩展
-
我会看看 DeltaSpike。但是,如果我希望它在 JEE 容器和 Spring 容器中都可以工作,那么使用 Spring Data 作为数据访问层是否有正当理由?
-
当然!但我的意见是使用 Spring 或 Java EE。使用 Spring,您可以使用任何 servlet 容器,例如 Tomcat 或 Spring。此外,Spring 提供了比普通 Java EE 更方便的功能
-
我试过 DeltaSpike,我很喜欢。看起来 DeltaSpike 使 JEE 容器中的事情变得更容易,更好地支持容器管理的事务。由于我们使用的是 EJB 和 CMT,也许 DeltaSpike 会是更好的选择。
-
当然。 DeltaSpike 是 CDI 扩展,而 Spring 是与 EJB 和 CDI 竞争的依赖注入容器。我永远不会把这两者混在一起。
标签: java spring-data spring-data-jpa eclipselink cdi