2011-12-12 51 views
0

我正在查找多個數據源,具體取決於x的值在EJB 3.0中。 要做到這一點,我寫了下面的代碼。在ejb3.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> 

上面的代碼工作successfully.but我認爲這不是理由如下一個很好的技術。 1.有10-15個多個會話bean,每個bean中我必須寫if-else來查找數據源。 2.未來,如果添加新的數據源或添加了任何新的x值,那麼我必須修改所有10-15個文件。

是否可以給我代碼,用於連接到多個數據源,這樣我就可以更改單個文件中的任何x值更改。 單個文件的外觀如何,以便我可以檢索'EntityManager'對象。或者有任何其他方法(如persistence.xml中的修改)來執行此操作?

回答

0

您可以將兩個實體管理器注入到另一個會話bean(QueryBean)中,並將QueryBean注入到會話bean中,而不是實體管理器本身。然後將查詢創建委託給QueryBean。然後這個bean根據x的值決定使用哪個實體管理器。

添加另一個實體經理或新值x時,您只需調整QueryBean即可。

+0

...你能告訴我我的代碼是怎麼樣的!......你可以給我一段代碼! – user752590

+0

在原始問題中我忘了提到的一件事:對於x的單值,可以在不同的會話bean中使用不同的查詢 – user752590

+0

如果您在每個bean中確實有不同的查詢,那麼委派創建查詢就沒有意義了。您必須在知道要構建哪個查詢的bean中執行此操作。 – tobiasbayer