JTA& MySQL - 如何从数据库中检索记录

时间:2013-03-16 22:31:26

标签: java ejb persistence entitymanager jta

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

修改

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

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

  • 创建自己的EntityManager(在这种情况下,您不能注入它;相反,您可以使用EntityManagerFactory并构建自己的EntityManager)。这是一个“应用程序管理的EntityManager”。你真的不想这样做。
  • 使用注入的EntityManaged(“conatiner managed 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方法时发生。这应该让你开始: - )