我正在开发一个应用程序,要部署在WebLogic 12c中,它需要能够在运行时获取连接到任意数据源的JPA EntityManager(EclipseLink 2.5.2) . 我目前不知道该数据源的JNDI名称是什么;将有几个到多个,连接到不同的数据库,但都具有相同的模式 . 因此,无法在应用程序内的persistence.xml中指定数据源名称;它必须来自外部(最有可能的配置文件) .
我不认为我可以注入EntityManagerFactory或EntityManager;它们与persistence.xml中的配置紧密耦合,我似乎无法覆盖JTA数据源名称 . 例如,这可以起作用 not :
@PersistenceUnit(unitName="myPU")
private EntityManagerFactory emf;
// ...
Map<String, Object> emProps = new HashMap<String, Object>();
emProps.put(EntityManagerProperties.JTA_DATASOURCE, "jdbc/foobar");
EntityManager em = emf.createEntityManager(emProps);
我在这里的EntityManager仍然连接到在persistence.xml中实际指定的JTA数据源 .
所以我开始考虑通过非注入方式创建EntityMangerFactory,就像 Persistence.createEntityManagerFactory(puName, propMap)
一样,但是在这里,似乎无论persistence.xml或我的属性映射说什么,我都得到一个 RESOURCE_LOCAL
EntityManagerFactory!
如何获得启用了JTA并与编译时未知的任意数据源名称相关联的EntityManager或EntityManagerFactory?
1 回答
这样做,至少在EclipseLink 2.5.2中是这样的:
通过将事务控制器添加到EMF,它再次获得JTA,并将遵守JTA事务 . 我的persistence.xml为JTA数据源提供了一个虚拟值;我在代码中重写并离开了!
NB :目前
getDatabaseSession()
和getServerSession()
实际上返回完全相同的对象 . 我只能设置其中一个,但这没有记录,你最好安全地设置它们,只是为了确定 .