问题本身表明您不了解您尝试使用的任何技术。在进行任何实际开发之前,您可能需要学习一些更通用的东西。
- 你可能会混淆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方法时发生。这应该让你开始: - )