这是我的问题。 我使用 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/