在ejb3.0中查找多个数据源

时间:2011-12-12 11:33:30

标签: persistence ejb-3.0

我正在查找多个数据源,具体取决于x在EJB 3.0中的值。 为此,我写了以下代码。

会话Bean

package entity.library;

import java.util.Collection;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import java.io.Serializable;
import javax.ejb.*;
@Remote(TestInterface.class)
@Stateless(mappedName="ejb3/TestBeans")

public class TestSessionBean implements Serializable, TestInterface {
 /**
 * 
 */
private static final long serialVersionUID = 1L;
@PersistenceContext(unitName="EntityBeanDS1")
   EntityManager emds1;

@PersistenceContext(unitName="EntityBeanDS2")
EntityManager emds2;

protected TestJPA test;
protected Collection <TestJPA> list;


  public Collection <TestJPA> getAllList(int x) {
System.out.println("TestInterface.java:getAllPmns x "+x);
if(x==1) 
{
    System.out.println("going to lookup datasource1");
    list=emds1.createQuery("SELECT test FROM TestJPA test").getResultList();
}

else if(x==2)
{
    System.out.println("going to lookup datasource2");
    list=emds2.createQuery("SELECT test FROM TestJPA test").getResultList();
}



 return list;
 }



}

Persitence.xml

<persistence version="1.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_1_0.xsd">

  <persistence-unit name="EntityBeanDS1" transaction-type="JTA">
  <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
  <jta-data-source>TESTDS</jta-data-source>
  <non-jta-data-source>TESTDS</non-jta-data-source>
  <properties>
  <property name="eclipselink.target-server" value="WebLogic_10"/>
  <property name="eclipselink.logging.level" value="FINEST"/>
  </properties>
  </persistence-unit>

 <persistence-unit name="EntityBeanDS2" transaction-type="JTA">
 <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
 <jta-data-source>TESTDS1</jta-data-source>
 <non-jta-data-source>TESTDS1</non-jta-data-source>
 <properties> 
 <property name="eclipselink.target-server" value="WebLogic_10"/>
 <property name="eclipselink.logging.level" value="FINEST"/>
 </properties>
 </persistence-unit>


 </persistence>

上面的代码工作成功。但我认为这不是一个好的技术,原因如下。 1.有10-15个多个会话bean,在每个bean中我必须编写if-else来查找数据源。 2.将来如果添加新数据源或添加x的任何新值,我必须修改所有10-15个文件。

可以给我一些代码,用于连接到多个数据源,这样我就可以为x值的任何变化更改单个文件。 单个文件的外观如何,以便我可以检索'EntityManager'对象。或者还有其他方法(比如persistence.xml中的修改)来做这个吗?

1 个答案:

答案 0 :(得分:0)

您可以将两个实体管理器注入另一个会话bean(QueryBean)并将QueryBean注入会话bean而不是实体管理器本身。然后将查询创建委派给QueryBean。然后,此bean根据x的值确定要使用的实体管理器。

添加其他实体管理员或x的新值时,您只需调整QueryBean