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

Noa*_*tin 2 java persistence ejb jta entitymanager

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

Query q = em.createNamedQuery("AnyQuery");
q.getResultList();
Run Code Online (Sandbox Code Playgroud)

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

fdr*_*ger 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方法时发生.这应该让你开始:-)