java - EJB/JPA批处理异常管理

标签 java hibernate jpa batch-file ejb

这是我的问题。 我使用 2 个 EJB/JPA/Hibernate 模块处理同步批处理。

第一个模块读取数据库A中的信息并检测变化。 一旦检测到,修改的项目将通过 JMS 发送到第二个模块。

第二个模块读取消息并遍历修改项并更新数据库B中的信息。

更新过程完成后,包含成功更新项目 ID 的消息将发送到第一个模块,该模块在数据库 A 中标记成功更新的项目。

所有过程都有效,但我不知道如何使用容器管理的 EntityManager 管理持久化过程中可能发生的异常

如果我没有使用容器管理的 EntityManager,我会为每个插入打开一个新事务,并根据是否发生任何异常来提交或回滚它。

我需要知道异常发生的时间,以便不在列表中添加当前正在处理的项目的 ID,并导致异常,项目的 ID 已成功更新。此外,如果我正在处理 10 个项目并且列表中的第一个创建了一个异常,我需要继续处理其他 9 个项目。

我认为在持久化方法前使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 可以解决我的问题,但事实并非如此。

有没有办法使用容器管理的 EntityManager 来完成我需要做的事情?

谢谢。

最佳答案

通过使用@TransactionManagement(TransactionManagementType.BEAN) 来定义类。我能够自己管理交易。

@Stateless

@TransactionManagement(TransactionManagementType.BEAN)
public class MyBean implements MyBeanInterface{
    @PersistenceContext
    private EntityManager em;
    @Resource
    private UserTransaction userTransaction;

    @Override
    public List<String> updateItems(List<Items> items) {
        List<String> itemsId=new ArrayList<String>();
        for(Item item : items){
            try{
                userTransaction.begin();
                doMyStuff(...);
                userTransaction.commit();
                itemsId.add(item.getId());
            }catch(Exception e){
                try {
                    userTransaction.rollback();
                } catch (IllegalStateException e1) {
                    e1.printStackTrace();
                } catch (SecurityException e1) {
                    e1.printStackTrace();                       
                } catch (SystemException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return itemsId;
    }
}

它正在工作,但我想知道是否有更简洁的方法来做到这一点? 我的意思是不使用明确的 beginTransaction、commitTransaction 和 rollbackTransaction。 例如,通过在 doMyStuff() 调用的方法周围使用注释:

谢谢。

关于java - EJB/JPA批处理异常管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9799895/

相关文章:

java - 如何修复 java 中的连接重置异常?

java - 如何在 Hibernate 查询中将 Integer 参数设置为 null?

java - 应用程序无法加载application.yml文件

hibernate - EntityManager 刷新问题

java - URI 参数中以逗号分隔 10 种货币的正则表达式模式

子类型重写方法中的 Java super 方法调用

java - Oracle 中 CHAR 主键列的 hibernate 和填充

java - 在 hibernate 中加入复合主键的某个属性

java - 返回函数和存储变量有什么区别?

java - 为什么 HikariCP 在关闭前一个数据库后不建立新的数据库连接?