我有一个应用程序,我安装在不同的服务器上 每个服务器都有不同的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的
答案 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;
}