2

我是 JTA 的新手,我需要一种方法来从数据库中检索一些元素。我可以通过 EntityManager 做到这一点,但这仅适用于 ResourceLocal。我想知道我该怎么做:

Query q = em.createNamedQuery("AnyQuery");
q.getResultList();

不使用EntityManager。有任何想法吗?

4

1 回答 1

5

这个问题本身表明您不了解您尝试使用的任何技术。在进行任何实际开发之前,您可能需要学习一些更通用的东西。

  • 您可能混淆了 JTA 和 JPA,
  • 您关于 RESOURCE_LOCAL 的陈述不正确(并且不相关) - 有 JTA 和 RESOURCE_LOCAL 事务,在 Java EE 中您通常使用前者,
  • 您在没有 EntityManager 的情况下使用命名 JPA 查询的想法显然很荒谬,并且可能源于某种误解(在没有实体管理器的情况下使用命名查询有什么意义?),
  • 说“来自数据库的一些元素”表明您无法真正区分记录和映射对象之间的区别,在这种情况下您可能根本不应该使用 JPA。

我并不是真的希望你接受这个答案。这只是我的挫败感。

编辑

好的,既然您提到了 JSF,我就更了解您的问题了。

我假设您想使用 JPA。在这种情况下,您可以选择:

  • 创建自己的 EntityManager(在这种情况下,您不能将其注入;相反,您必须使用 EntityManagerFactory 并构建自己的)。这是一个“应用程序管理的 EntityManager”。你真的不想这样做。
  • 使用注入的 EntityManaged(“容器管理的 EntityManager”)。这是标准选择。

现在你需要一笔交易。由于您应该使用 JTA EntityManager,因此您需要一个负责协调整个事情的事务对象。同样,您有两个选择:

  • 在 JSF bean 中,注入一个 UserTransaction(使用 @Resource 注释)。这很混乱,容易出错并且需要大量的样板,但你会找到所有必要的方法。您可以创建自己的(应用程序管理的)EntityManager,调用其 joinTransaction 方法,然后在 UserTransaction 上调用 begin-commit。这将是一个“应用程序管理事务”
  • 将您的 EntityManager 代码移动到 EJB。它只需要几行代码和一个注释(@Statless)。EJB 中的所有代码 - 神奇地 - 包装在容器为您管理的事务中。这是“容器管理事务”——默认和常见的选择。

上面的每一件事都可以(并且应该)用一些额外的信息来扩展。但对你来说,捷径是:

  • 创建一个 EJB(一个带有 @Stateless 注解的简单类),
  • 将使用 EntityManager 的方法移动到 EJB,
  • 将 EJB 注入您的托管 bean(使用 @EJB 注释)并调用相关方法。

JTA 事务将在每次调用任何 EJB 方法时发生。这应该让你开始:-)

于 2013-03-16T22:40:34.280 回答