【发布时间】:2012-11-09 17:28:40
【问题描述】:
我有一个包含多个模式的数据库,所以我有一个包含多个 <persistence-unit />(命名为 01、02、...)的 persistence.xml 文件。
有问题: 我想根据一些用户条件动态创建一个 EntityManager 函数。
我已经测试了 2 个案例。
第一种情况:基本上,我测试了这段代码(在无状态 EJB 中):
String criteria = "01";
EntityManagerFactory emf = Persistence.createEntityManagerFactory(criteria);
EntityManager em = emf.createEntityManager();
Joueur joueur = new Joueur(); // Joueur is an Entity
joueur.setPseudo("olivier");
em.persist(joueur);
但我收到异常:
原因:异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 内部异常:org.postgresql.util.PSQLException:ERREUR:la transaction est annulée,les commandes sont ignorées jusqu'à la fin du bloc 德拉交易
我认为(在一些 Stackoverflow 帖子的帮助下),我的 EntityManager 没有“链接”到我的事务上下文,因为它不是由容器注入的。
第二种情况:因此,我使用了注入:
@PersistenceContext(unitName="00")
private EntityManager em00;
@PersistenceContext(unitName="01")
private EntityManager em01;
我的函数中的代码:
String criteria = "01";
EntityManager em = getEm(criteria);
...
和 getEm() 方法:
private EntityManager getEm(String criteria){
if (criteria == "00")
return em00;
else if (criteria == "01")
return em01;
return null;
}
没问题,它可以工作,但我必须注入尽可能多的 EntityManagers,我有持久性单元。
- 如果我有 50 个模式,成本是多少...?
- 有没有办法真正动态地管理实体管理器? (仅限 1 个 EntityManger)
- 如果我必须为每个架构创建 1 个 EntityManager,即使我不使用它,我该如何改进我的代码以尽可能减少资源消耗?
感谢您的建议和反馈
编辑:
我的配置文件:
Persistence.xml:
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="00" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/sim/00</jta-data-source>
<mapping-file>orm_00_beta.xml</mapping-file>
<class>com.sim.entities.Joueur</class>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables" />
</properties>
</persistence-unit>
<persistence-unit name="01" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/sim/01</jta-data-source>
<mapping-file>orm_01_beta2.xml</mapping-file>
<class>com.sim.entities.Joueur</class>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables" />
</properties>
</persistence-unit>
</persistence>
orm_00_beta.xml:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
version="2.0">
<persistence-unit-metadata>
<persistence-unit-defaults>
<schema>beta</schema>
</persistence-unit-defaults>
</persistence-unit-metadata>
orm_01_beta2.xml:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
version="2.0">
<persistence-unit-metadata>
<persistence-unit-defaults>
<schema>beta2</schema>
</persistence-unit-defaults>
</persistence-unit-metadata>
【问题讨论】:
-
你能用相关的persistence.xml内容更新帖子吗
标签: java jpa entitymanager