java - JTA 和 MySQL - 如何从数据库检索记录

标签 java ejb persistence entitymanager jta

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

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

不使用EntityManager。 有什么想法吗?

最佳答案

问题本身表明您不了解您尝试使用的任何技术。在进行任何实际开发之前,您可能需要研究一些更一般的内容。

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

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

编辑

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

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

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

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

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

上面的每件事都可以(并且应该)用一些附加信息进行扩展。但最适合您的路径是:

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

JTA 事务将在每次调用任何 EJB 方法时发生。这应该可以帮助您开始:-)

关于java - JTA 和 MySQL - 如何从数据库检索记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15455475/

相关文章:

java - 提取所有出现的模式K,并在一遍检查字符串是否匹配 "K*"

java - 通过 EJB 共享静态单例

java - hibernate 性能问题,坚持一个接一个还是批量?

java - JSF 2、EL Expression、Weblogic 和 EJB 注入(inject)

java - Enterprise JavaBean 中方法的访问修饰符

ios - 如何更新核心数据?

database - Hibernate saveOrUpdate vs update vs save/persist

java - 如何在 JFreeChart 中用鼠标滚轮旋转饼图?

java - Jersey 2 - 带有 header 示例的简单客户端获取

java - Google App Engine 用户代理