如何以编程方式将持久化上下文注入到不同的数据源中

Pri*_*imk 6 persistence jpa entitymanager ejb-3.0

在标准EJB 3中,当注入实体管理器时,持久性单元(指数据源)被硬编码到注释中:(或者xml文件)

@PersistenceContext(unitName = "myunit")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

有没有办法使用实体管理器,但在运行时按名称选择数据源?

小智 5

使用EclipseLink,您可以设置在应用服务器中配置的DataSource.

import org.eclipse.persistence.config.PersistenceUnitProperties;
...


....
Map props = new HashMap();  
props.put(PersistenceUnitProperties.JTA_DATASOURCE, "dataSource");  
EntityManagerFactory  emf = Persistence.createEntityManagerFactory("UNIT_NAME", props);
EntityManager em = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)

PU_NAME指文件中使用的名称persistence.xml
dataSource将应用程序服务器中用于jdbc资源的名称称为"jdbc/sample"

  • 请注意,这将创建一个应用程序管理的EntityManager.原始问题引用了使用容器管理的EntityManager的代码. (2认同)

Nay*_*kar 2

  • 在 persistence.xml 中配置所需的数据源和持久单元。
<persistence-unit name="UNIT_NAME" transaction-type="JTA">
      <provider>PERSISTENCE_PROVIDER</provider>
          <jta-data-source>java:DATA_SOURCE_NAME</jta-data-source>
</persistence-unit>

 -- other units  
Run Code Online (Sandbox Code Playgroud)

现在,在运行时,您可以为所需的持久性单元构建实体管理器。为每个数据源创建单独的持久性单元。

//---
EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);
EntityManager em = emf.createEntityManager();
//---
Run Code Online (Sandbox Code Playgroud)
  • 另外,您还可以通过提供 db-url、userName 等属性的映射来构建工厂。
createEntityManagerFactory(persistenceUnitName,propertiesMap);
Run Code Online (Sandbox Code Playgroud)

这将使用给定的属性为指定的持久性单元创建并返回 EntityManagerFactory。因此,您可以在运行时相应地更改属性。