Динамический поиск источника данных с использованием JPA - PullRequest
0 голосов
/ 14 декабря 2011

Я хочу привязать переменную dataSourceString (возможное значение: HR, FINANCE: я получаю значение dataSourceString динамически с помощью jsp) к DataSource.Когда значение dataSourceString равно HR, тогда подключаться к TESTDS, а когда значение dataSourceString равно FINANCE, тогда подключаться к TESTDS1.Means на основе значения dataSourceString, которое я хочу подключить к источнику данных.Среда: EJB3, weblogic10.3.3, JPA

Примечание: Еще одна вещь, которую я не хочу писать цикл if-else в сессионном, например, когда dataSourceString равен HR, затем подключиться к этому EnityManage еще к другому EntityManager.-15 возможное значение dataSourceString.Я хочу написать код, как если бы в будущем, если новый dataSourceString был добавлен, то мне нужно только изменить persistence.xml.

После исследования я пришел к следующему коду, но получил некоторую ошибку.

Ошибка: -

No persistence unit named 'em' is available in scope test.jar. Available persistence units: [HR, FINANCE]


    at weblogic.ejb.container.deployer.EJBModule.prepare(EJBModule.java:467)
    at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:199)
    at weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:507)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:41)
    at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:149)
    Truncated. see log file for complete stacktrace

      Caused By: java.lang.IllegalArgumentException: No persistence unit named 'em' is available in scope test.jar. Available persistence units: [HR, FINANCE]
    at weblogic.deployment.ModulePersistenceUnitRegistry.getPersistenceUnit(ModulePersistenceUnitRegistry.java:132)
    at weblogic.deployment.BasePersistenceContextProxyImpl.<init>(BasePersistenceContextProxyImpl.java:38)
    at weblogic.deployment.TransactionalEntityManagerProxyImpl.<init>(TransactionalEntityManagerProxyImpl.java:35)
    at weblogic.deployment.BaseEnvironmentBuilder.createPersistenceContextProxy(BaseEnvironmentBuilder.java:974)
    at weblogic.deployment.BaseEnvironmentBuilder.addPersistenceContextRefs(BaseEnvironmentBuilder.java:855)
    Truncated. see log file for complete stacktrace

Очевидно, что в файле persistence.xml отсутствует единица персистентности для em, но как мне добиться динамического поиска источника данных с использованием jpa.Ниже приведен мой код

Сессионный компонент

package entity.library;
import java.util.Collection;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import java.io.Serializable;
import javax.ejb.*;

@Remote(TestInterface.class)
@Stateless(mappedName="ejb3/TestBeans")

public class TestSessionBean implements Serializable, TestInterface 
{
 protected TestJPA test;
protected Collection <TestJPA> list;

@PersistenceContext
private EntityManager em;
@PersistenceUnit
private EntityManagerFactory emf; 


   public Collection <TestJPA> getAllList(String dataSourceString) {

emf = Persistence.createEntityManagerFactory(dataSourceString);
em = emf.createEntityManager(); 

list=em.createQuery("SELECT test FROM TestJPA test").getResultList();
   return list;
  }
  }

persistence.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="HR" 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="FINANCE" 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>

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Если в файле persistence.xml определена единица персистентности, то она является единицей по умолчанию для приложения, и она добавляется аннотацией.

Вы можете вручную искать конкретный контекст персистентности во время выполнения.

 javax.persistence.EntityManager entityManager =
                (javax.persistence.EntityManager)initCtx.lookup(
                    "java:comp/env/" + persistenceContext);
0 голосов
/ 06 декабря 2012

Еще лучше ...

Вместо: @PersistenceContext (имя = "myPU")
частный EntityManager em;

указать:

@ PeristenceContext (UnitName = "myPU")
частный EntityManager em;

...