2011-12-14 45 views
0

我想绑定变量dataSourceString(可能的值:HR,FINANCE:我通过jsp动态获取dataSourceString值)到DataSource。当dataSourceString值为HR,然后连接到TESTDS,并且当dataSourceString值为FINANCE时,根据我想要连接到数据源的dataSourceString值连接到TESTDS1.Means。 Enviornment:EJB3,weblogic10.3.3,JPA使用JPA的动态数据源查找

注:还有一两件事,我不想写的if-else循环中的SessionBean喜欢当dataSourceString是HR那么其他连接到该EnityManage不同EntityManager.currently有10 dataSourceString的15个可能的值。我想编写代码,如果将来添加新的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 

错误是显而易见的,没有持久性单元为EM是在persistence.xml中 可用,但我如何能实现使用JPA动态数据源的查找。 以下是我的代码

会话Bean

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

如果在persistence.xml中定义一个持久性单元,则默认单位申请&相同是通过注释注入的。

您可以在运行时手动查找特定的持久化上下文。

javax.persistence.EntityManager entityManager = 
       (javax.persistence.EntityManager)initCtx.lookup(
        "java:comp/env/" + persistenceContext); 
0

更妙的是...

相反的: @PersistenceContext(NAME = “myPU”)
私人EntityManager的EM;

指定:

@PeristenceContext(的unitName = “myPU”)
私人EntityManager的EM;