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

会话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的任何newvalue,那么我必须修改所有10-15个文件。

可以给我代码,以连接到多个数据源,以便我对x值的任何更改更改一个文件。 该单个文件的外观如何,以便我可以检索“ EntityManager”对象。 还是有其他方法(例如在persistence.xml中进行修改)来做到这一点?

===============>>#1 票数:0

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

当添加另一个实体管理器或新的x值时,您只需要调整QueryBean

  ask by user752590 translate from so

未解决问题?本站智能推荐:

2回复

Websphere EJB3.0计时器避免持久性

Websphere 7.0,EJB3.0 有没有办法避免默认的EJB计时器持久性。 看起来计时器在服务器崩溃和重新启动后仍然存在。 谢谢!
2回复

在ejb 3.0中声明交易

我该如何强制EJB在执行每个事务后不刷新所有命令。 我读过,这是以声明方式完成的。 但是到底如何呢?
2回复

使用JPA进行动态数据源查找

我想将变量dataSourceString(可能的值:HR,FINANCE:我通过jsp动态获取dataSourceString值)绑定到DataSource。 当dataSourceString值为HR然后连接到TESTDS,当dataSourceString值为FINANCE时,根据我要连
4回复

如何以编程方式将持久化上下文注入到不同的数据源中

在标准EJB 3中,当注入实体管理器时,持久性单元(指数据源)被硬编码到注释中:(或者xml文件) 有没有办法使用实体管理器,但在运行时按名称选择数据源?
1回复

在运行时创建参数化持久性单元+ JTA数据源(取决于上下文)

我正在尝试编写一个获取参数“customerCode”(String)的EJB3无状态会话Bean。 依赖于这个“customerCode”,我想用(动态?)创建的PersistenceUnit创建一个EntityManager(Persistence.createEntityManagerF
1回复

EJB3持久性NamedQuery中的LockMode

我们如何在EJB3 Persistence NamedQuery中指定LockMode? 我想将Pessimistic LockMode添加到我现有的选择中,以便我可以在必要时进行更新,但是令人惊讶的是,查询对象没有setLockMode(xxx)方法(我的理解是,如果JPA是EJB3持久性的
1回复

如何在EJB3中使用非关键复合元素?

使用EJB3 / JBoss,如何使用表中的复合元素,例如 其中“ Coordinate的定义为(为了便于阅读而省略了设置者/获取者): 并且所有内容都应映射到表X ,其中包含列id , x和y 。
1回复

如何在多个数据库(分布式系统)中保留相同的JPA实体?

(如何)可以将JPA实体持久保存在多个服务器的数据库中,而无需将所有内容复制到DTO中? 我们有一个分布式系统。 某些应用程序确实有用于缓存目的的DB。 JPA Provider抛出一个异常,它抱怨它不能持久保存分离的对象。 但我想保留实体的ID,只需将其保留在这个额外的数据库中
2回复

EJB3-处理RollBackExceptions

我有一个EJB3应用程序,该应用程序由一些用于访问数据库的EJB组成,并通过Session Bean作为Web服务公开。 现在,我需要找出两件事: 1)有什么方法可以阻止SQL异常导致Web服务引发SOAP Fault? 事务由容器处理,当前sql异常导致抛出RollBackExc
1回复

为什么ejb3的@Transient无法正常工作? 它仍然坚持

尽管如此,在数据库中,我仍然看到它仍然存在吗? 对这种怪异行为有任何想法吗?