【发布时间】:2016-02-20 19:51:10
【问题描述】:
我正在使用 JPA 2.1,我有类似的东西
public class EntityManagerProducer {
@Produces
@PersistenceContext(unitName="first_PU")
private EntityManager em;
...
如何动态修改@PersistenceContext(unitName = "somer_PU") 中的unitName 以使用其他实体管理器?这可能吗?
非常重要的更新
我有一个部署的应用程序,persistence.xml 看起来像这样:
<persistence-unit name="db1" transaction-type="JTA">
<jta-data-source>java:/jboss/datasources/PostgresDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="jboss.entity.manager.jndi.name" value="java:app/entitymanager/db1"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:app/entitymanagerfactory/db1"/>
</properties>
在运行时,可以修改 persistence.xml 并添加另一个持久性单元,但我需要一种方法来获取我需要的实体管理器,方法是传递持久性单元的名称或其他内容,然后将其用于我想要的。然后我可以提供另一个持久性单元名称并获得不同的实体管理器。当然我希望交易过程仍然是容器管理。
【问题讨论】:
-
对不起,但我仍然认为在运行时更改持久性单元名称没有任何意义。你可以解释吗?您的应用程序是否需要与多个不同的数据库通信? 在运行时,可以修改persistence.xml ...是什么意思?
-
我的意思是,当应用程序部署在服务器上时,它可以添加更多的持久性单元。是的,我需要我的应用程序可以与多个不同的数据库通信。
-
但是仅仅动态定义数据源还不够吗?老实说,您可以在您的 java 代码中连接到任何数据库:开玩笑地打开一个连接并执行所需的 SQL 语句(不使用
EntityManager)。顺便说一句:您的应用程序与数据库的数量是固定的吗?
标签: jpa ejb persistence cdi entitymanager