![cdi name 日志](https://i-blog.csdnimg.cn/blog_migrate/420ac8b195ecc7e7fd576728537b620b.png)
cdi name 日志
在Java EE中,在执行事务性业务方法期间引发的异常导致事务回滚。 但是,只有系统异常(即运行时异常)才是这种情况,该方法异常未在方法签名中声明。
对于应用程序异常(即检查的异常)或任何带@ApplicationException
注释的异常,不会自动回滚事务。 有时这会引起企业开发人员的困惑。
对于EJB商业方法,也可以通过指定@ApplicationException(rollback = true)
来强制事务回退应用程序异常。 但是,仅当EJB中的托管bean时才考虑使用此注释。
CDI还可以使用@Transactional
事务上执行业务方法。 此注释使我们拥有更多控制权。 使用@Transactional
我们不仅可以定义事务类型,例如REQUIRED
或REQUIRES_NEW
,而且可以定义我们要回滚或不希望回滚的异常类型:
public class CarManufacturer {
@Inject
CarFactory carFactory;
@Inject
Event<CarCreated> createdCars;
@PersistenceContext
EntityManager entityManager;
@Transactional(rollbackOn = CarCreationException.class,
dontRollbackOn = NotificationException.class)
public Car manufactureCar(Specification specification) {
Car car = carFactory.createCar(specification);
entityManager.persist(car);
createdCars.fire(new CarCreated(car.getIdentification()));
return car;
}
}
CarCreationException
发生CarCreationException
,事务将被回滚,但不是NotificationException
。
翻译自: https://www.javacodegeeks.com/2018/01/transactional-exception-handling-cdi.html
cdi name 日志