Поиск нескольких источников данных в ejb3.0 - PullRequest
0 голосов
/ 12 декабря 2011

Я ищу несколько источников данных, в зависимости от значения х в EJB 3.0. Для этого я написал следующий код.

Session 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 множественных сессионных бинов, в каждом бине я должен написать if-else для поиска источника данных. 2. В будущем, если будет добавлен новый источник данных или любое новое значение x, мне придется изменить все 10-15 файлов.

Можно ли дать мне код для подключения к нескольким источникам данных, чтобы я мог изменить один файл для любого изменения значения x. Как будет выглядеть этот отдельный файл, чтобы я мог получить объект EntityManager. или есть другой метод (например, изменение в persistence.xml) для этого?

1 Ответ

0 голосов
/ 12 декабря 2011

Вы можете внедрить обоих менеджеров сущностей в другой сессионный компонент (QueryBean) и внедрить QueryBean в ваши сеансовые компоненты вместо самих менеджеров сущностей.Затем делегируйте создание запроса на QueryBean.Затем этот компонент решает, какой менеджер сущностей использовать в зависимости от значения x.

. При добавлении другого менеджера сущностей или нового значения x вам просто нужно настроить QueryBean.

...