JPA中如何使用事务?

在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注解的优点:

  1. 简单方便,只需要添加注解即可。
  2. 与Spring Framework无缝集成,建议用于Spring项目。

Transaction API的优点:

  1. 细粒度的事务管理,可以控制事务的范围。
  2. 可扩展性更强,可以根据业务需要自定义事务管理器。

@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();
        }
    } 
}