问题标签 [container-managed]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
173 浏览

java - 容器管理事务 - 异步方法调用

以下是我的要求: 1. MDB 收到一条消息

  1. 在另一个会话 bean 中触发异步方法 - 异步,因为此方法将是一个长时间运行的线程,我们不想长时间持有 MDB 线程。异步方法从数据库中读取记录,处理它们并调用#3。

  2. 写入另一个 MQ,然后将一些数据插入 DB。POSTING TO MQDB INSERT应该在一个事务中。

这是实现:

对于 #1 - 使用 MDB - 没有任何事务属性的容器管理事务。

对于 #2 - 无状态会话 bean -容器管理,异步,但事务属性为NOT_SUPPORTED(不支持,因为这是一个长时间运行的线程,所以不希望事务超时)。

For# 3 - 无状态会话 bean(从 #2 调用,用于在 2 中读取的每条记录 - 在循环中执行) - 事务属性 - REQUIRES_NEW,因为此方法发布到 MQ 并插入到数据库中。

问题:

  1. 运行时异常 - 当我从 #3 抛出运行时异常时,不会处理下一个记录 - 会话 bean 刚刚退出。

  2. 异常 - 抛出自定义异常时,当数据库插入失败时,队列上的消息不会恢复。

实施或解决此问题的最佳方法是什么。

我尽我所能提供细节 - 感谢任何帮助。

0 投票
1 回答
71 浏览

jpa - 如何使用 JPA OneToMany 关系一次更新多个对象?

我有PrincipalPrincipalRoles实体类。它们具有如下定义的双向“父子”关系:

校长有:

PrincipalRoles具有:

我还在 Java EE 应用程序的 Web 模块中有一个主从网页。该页面使用应用程序的 EJB 模块中包含的实体类及其对应的外观。

该页面获取Principal对象,然后使用无状态 EJB 的方法PrincipalFacadeBean对其进行更新,该方法基本上执行实体管理器的查找合并方法。持久性上下文是容器管理的。

该页面可以添加和删除多个PrincipalRoles,然后成功合并Principal。它还可以添加和删除几个PrincipalRoles,更新之前添加的一个,然后合并Principal但是当尝试在单个合并操作中更新多个时它总是失败。在这些情况下,不会引发异常,但不会在数据库中更新任何内容。甚至没有Principal的其他字段,例如姓名、电子邮件等。

该应用程序在 GlassFish 5.1.0、Java 1.8.0_281、EclipseLink 2.7.4、PostgreSQL 13 上运行。

我已经处理这个问题几天了,我的想法已经不多了。您能提供的任何帮助将不胜感激。

回答@crizzis问题的附录

我不确定服务方法是什么。页面 bean 直接使用此方法调用外观:

在主从页面中,列表仅包含主页面。这是外观的合并方法:

这些是PrincipalRolesequals的和hashCode方法。实际上,这些方法在所有实体类中都有相同的模板。

这是ObjUtils.equals

更新后的PrincipalRoles的主要字段是被合并Principal对象(至少是它们的匹配项)。我还检查了未修改的PrincipalRoles的值。那是。System.identityHashCodenull