【发布时间】:2017-10-06 21:23:20
【问题描述】:
我有一个batchEdit(List<E> entity) 在循环中调用edit(E entity) 函数,而每个edit() 都有自己的事务,因此失败的编辑不会回滚好的编辑。我目前的实现方式如下:
选项 1
@Stateless
@TransactionManagement( value = TransactionManagementType.CONTAINER )
public class Service<E> {
@Resource
private SessionContext context;
@Override
@TransactionAttribute( value = TransactionAttributeType.REQUIRES_NEW )
public E edit( E entity ) {
//edit code
}
@Override
public List<E> bulkEdit( List<E> entities ) {
for(E entity : entities){
//case 1: Regular edit, Does not create a new transaction!
//edit(entity);
//case 2: Hacky edit, creates a new transaction
context.getBusinessObject( Service.class ).editPersistNulls( entity );
}
}
}
根据this stackoverflow discussion,@TransactionAttribute 在我的案例 1 中被忽略,因为它不跨越任何 EJB 边界,所以 batchEdit() 调用 edit() 就好像它没有被注释一样。在案例 2 中使用 context.getBusinessObject() 函数来获取 bean 的引用会导致 TransactionManagement 注释起作用,但通过所有这些似乎真的很奇怪。
选项 2
我的另一个选择是更改为 bean 托管事务:
@TransactionManagement( value = TransactionManagementType.BEAN )
但是那样我就会失去“JPA 魔法”,不得不到处管理交易。我认为我的团队中的其他人不会想要这样做,所以如果有更好或标准的方法来做到这一点,任何见解都会受到赞赏。
我们正在使用 OpenJPA 和 EJB,但我们正在努力接近 JPA 标准。
【问题讨论】:
标签: jakarta-ee ejb bulk transactional