persistence.xml中的动态“jta-data-source”prop

时间:2014-09-29 08:03:41

标签: jdbc ejb-3.0 openjpa

我有一个应用程序,我安装在不同的服务器上 每个服务器都有不同的jdbc名称 jdbc名称也定义在(java)system-prop" jdbc_name"在所有服务器

我尝试改变" jta-data-source"动态地使用来自system-prop的值(" jdbc_name")

现在 在我的情况下,我使用

@PersistenceContext(unitName="MyUnit")
private EntityManager em;

的persistence.xml:

 <persistence-unit name="MyUnit" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>jdbc/myJdbcName</jta-data-source>
    <class>com.myCom.myClass</class>
    <properties>
       <property name="openjpa.TransactionMode" value="managed"/>
    </properties>
</persistence-unit>

我正在使用: websphere的 EJB3 OpenJPA的

1 个答案:

答案 0 :(得分:0)

据我所知,如果您使用容器管理的实体管理器,现在可以这样做。

您必须回到应用程序管理的实体管理器,并且为了不进行手动工作,您可以将其与CDI集成。 这将涉及手动管理事务边界。为了避免这种手动事务边界管理,您可以使用拦截器:

@ApplicationEntityManagerInterceptorBinding
@Interceptor
public class ApplicationEntityManagerInterceptor {

  @Inject
  @ApplicationEntityManager
  private EntityManager em;

  @AroundInvoke
  public Object intercept(final InvocationContext ic) {
   //check if transaction is active, otherwise create a new one
   em.createTransaction....
   try {
    return ic.proceed();
   } catch (Exception ex) {
     //does the exception require rollback? rollback the transaction here
   } finally {
     //commit the transaction if necessary.
   }
  }
}

@Stateless
public class EntityManagerFactoryProducer {

  @Produces
  @ApplicationEntityManager
  public EntityManager entityManager() {
    final EntityManagerFactory emf = Persistence.createEntityManager("persistence_name");
    return emf.createEntityManager();
  }

  //you will have to manage this yourself
  public void dispose(@Dispose final EntityManager em) {
    em.close();
  }
}

然后你需要它的任何地方!

@Stateless
@ApplicationEntityManagerInterceptorBinding
public class MyDAO {
  @Inject
  @ApplicationEntityManager
  private EntityManager em;
}