我是第一次在 WebSphere Commerce 7 环境中使用 JPA。我能够使用容器管理的持久性使其一切正常,因此它可以自行保存对象。问题是,我需要确保在事务存在的逻辑结束之前将数据保存到数据库中,因为如果数据未提交到最后可能会引入竞争条件的更多逻辑数据库之前。如果我在我调用的点添加调试点entityManager.persist,并且在我调用的点之后entityManager.close,我可以查询数据库并且在那里看不到任何数据。但是,一旦我让逻辑运行并到达课程的末尾,数据就会显示出来。所以我想也许我需要尝试应用程序管理的持久性。当我读到如何做到这一点时,我感到很困惑,因为看起来我已经无意中以这种方式构建了我的逻辑,但它仍然不允许我管理事务。而且我尝试的所有操作都会导致一些异常,尤其是当我尝试调用getTransaction.commit()或任何类似的手动提交时。所以这就是我使用 CMT 所做的工作(或者至少我认为它是 CMT)然后我创建了一个 JpaConnectionHelper,我希望将它做成可以传递值的东西,并让它根据我传入的字符串为我创建一个特定的持久性单元。正因为如此,我似乎在做逻辑似乎已经是应用程序管理事务所需的逻辑类型。为了完成这项工作,我必须调用Persistence.createEntityManagerFactory(persistenceUnitName)以创建 An,EntityManagerFactory因为我将 persistenceUnitName 传递给类。我读到的东西告诉我,这意味着我将进行应用程序管理——但也许我在这方面错了。无论如何,该课程的核心是:将这个对象传递给其他类时,getter 让我可以访问 Entitymanager - 也许这是我的错误,试图创建这个帮助器类,而不是仅仅创建更接近我保存数据的位置的持久性逻辑?然后我继续创建一堆 DAO,它们返回一个对象,该对象具有要映射到我的数据库的所有持久性注释。我将 JpaConnectionHelper 的实例传递给每个 DAO,所以现在它们都可以访问 EntityManager 和要保存的对象。我还为所有 DAO 提供了一个.persistDao()方法,该方法将使用 EntityManager 来调用.persist()已创建的对象。所以现在我基本上有了一个 DAO,其中包含我要保存的填充对象和一个 EntityManager。所以我在DAO上调用了persist方法,它保存得很好。因此,我想尝试使用应用程序管理的事务来实现这一点。我首先尝试entityManager.flush()在persist 方法调用之后调用,但这没有任何作用(也不例外)。然后我尝试entityManager.getTransaction.commit()在同一个地方添加,这会引发您可能期望的异常:You cannot access the EntityTransaction when using managed transactions.如果我错了,现在纠正我,但这不表明我正在使用 CMT 吗?EntityManagerFactory如果是这样,当我不为我的or使用注射时,为什么我能够做到Entitymanager?顺便说一句,我尝试了有和没有第一次调用的版本joinTransaction()所以我阅读了更多,发现我可能需要注入一个 UserTransaction,所以我尝试将它添加到 JPAConnectionHelper(EntityManager 实例所在的位置)
1 回答
慕莱坞森
TA贡献1810条经验 获得超4个赞
我找到了一个解决方案,可以让我专门在 WebSphere 环境中使用以下方式访问事务:
TransactionManager.commit();
似乎此方法能够以我没有尝试过的方式访问 UserTransaction 上下文。所以我敢肯定,如果需要,我现在也可以这样做,但是,如果这门课为我做,为什么不直接使用它
添加回答
举报
0/150
提交
取消