当前位置: 首页 > 知识库问答 >
问题:

如何在WebLogic12c中创建一个在编译时不知道数据源的支持JTA的EntityManager?

卫博雅
2023-03-14
@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);

这里的My作为My EntityManager仍然连接到实际在persistence.xml中指定的JTA数据源。

因此,我开始考虑通过非注入的方式创建EntityManagerFactory(比如使用persistence.createEntityManagerFactory(puName,propMap),但在这里,不管persistence.xml或我的属性映射怎么说,我都得到了一个resource_localEntityManagerFactory!

如何获得启用JTA并与编译时未知的任意数据源名称关联的EntityManager或EntityManagerFactory?

共有1个答案

宗政权
2023-03-14

至少在EclipseLink 2.5.2中是这样的:

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put(PersistenceUnitProperties.TRANSACTION_TYPE, "JTA");
    properties.put(PersistenceUnitProperties.JTA_DATASOURCE, "jdbc/foobar");
    emf = Persistence.createEntityManagerFactory("myPU", properties);
    JpaEntityManagerFactory jemf = (JpaEntityManagerFactory)emf;

    WebLogicTransactionController wlstx = new WebLogicTransactionController();
    if (jemf.getDatabaseSession() != null && jemf.getDatabaseSession().getExternalTransactionController() == null) {
        jemf.getDatabaseSession().setExternalTransactionController(wlstx);
    }
    if (jemf.getServerSession() != null && jemf.getServerSession().getExternalTransactionController() == null) {
        jemf.getServerSession().setExternalTransactionController(wlstx);
    }

通过将事务控制器添加到EMF,它将再次与JTA一起登记,并将尊重JTA事务。My persistence.xml为JTA数据源提供了一个虚拟值;我在代码上重写我们就走!

注意:当前的getDatabaseSession()getServerSession()实际上返回完全相同的对象。我可以只设置其中一个,但这是没有文档记录的,您最好安全地设置两个,只是为了确保。

 类似资料:
  • 在这种情况下,编译器如何知道typename T将在其上定义一个方法?在Java中,我们可以指定泛型类扩展的接口,但C++显然没有相同的语法。那么,如果我们调用会发生什么呢?

  • 问题内容: 我正在尝试执行以下操作: 但是我收到以下错误: 有人可以告诉我我在做什么错吗? 问题答案: 鉴于演员表并不会 真正 检查事情,我将使用完全原始的版本: 这似乎有效。完整的例子:

  • 我试图使用JTA数据源实例化EntityManager,但我总是得到NullPointerException。这是我的环境:服务器:JBossas7.0JPA:2.0DB:MySQL 坚持不懈xml 在dao类中,我尝试以下方法: 但是当我使用它的getter时,我在这里得到NullPointerExctive: 调试显示它为空。 以下是standalone.xml中的数据源定义: "mysql"

  • 我想在Mac终端中编译C11源代码,但失败了。我尝试了、、和 ,但都没有成功。终端始终读取 。然而, 和类似的东西运行良好(当然,C11源代码无法通过)。 我应该使用哪个选项来打开C 11支持? 顺便说一下,我正在使用的命令行工具安装在Xcode中,我很确定它们是最新的。

  • 有没有办法知道Val的值在编译时或运行时是已知的?我是说我能在IDE或其他地方查一下吗?自从我用谷歌搜索之后,就再也没有关于它的文章了。他们只是指出哪些是在编译时已知的,哪些是在运行时已知的,但没有提到如何知道这一点。 据我所知,如果我将一个基元类型或字符串赋给Val,它的值在编译时就会被知道。相反,如果我指定了一个函数或对象(需要从另一个地方计算或引用该值),它的值在运行时是已知的。但是,有没有

  • 如果属性名称仅在运行时已知,如何读取 Kotlin 数据类实例中的属性值?