在JPA中可以通过使用@Transactional注解或者Transaction API实现事务管理。
@Transactional注解:
- 用于标记Service层的业务方法,定义其事务属性。
- 当业务方法被调用时,会开启一个事务,方法执行结束后会提交或回滚事务。
语法:
@Transactional(propagation = Propagation.REQUIRED)
public void method() { ... }
Transaction API:
- 通过EntityManager的getTransaction()方法获取Transaction对象。
- 显式的开启、提交和回滚事务。
示例:
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); // 开启事务
// 执行业务操作
tx.commit(); // 提交事务
} catch (Exception ex) {
tx.rollback(); // 回滚事务
}
@Transactional注解的优点:
- 简单方便,只需要添加注解即可。
- 与Spring Framework无缝集成,建议用于Spring项目。
Transaction API的优点:
- 细粒度的事务管理,可以控制事务的范围。
- 可扩展性更强,可以根据业务需要自定义事务管理器。
@Transactional注解示例:
@Service
public class UserService {
@PersistenceContext
EntityManager em;
@Transactional
public void register(User user) {
em.persist(user);
}
}
Transaction API示例:
@Service
public class UserService {
@PersistenceContext
EntityManager em;
public void register(User user) {
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(user);
tx.commit();
} catch (Exception ex) {
tx.rollback();
}
}
}