Spring Transactional Annotation

时间:2015-06-05 13:36:48

标签: java spring spring-mvc transactions entitymanager

我试图更好地处理Spring @Transactional属性的使用。据我所知,它基本上包含了在事务中标记为@Transactional的方法的内容。将服务/业务层方法标记为事务性是否合适,而不是实际的DAO方法,就像我在这里所做的那样?

服务实施

public class UserServiceImpl implements UserServiceInt{
   @Autowired
   private UserServiceDAO serviceDAO;


   @Override
   public User getUser(int id){
      return serviceDAO.getUser(id);
   }

   @Override
   @Transactional
   public void updateUserFirstName(int id, String firstName) throws SomeException{
      User userToUpdate = getUser(id);
      if(userToUpdate == null){
         throw new SomeException("User does not exist");
      }
      userToUpdate.setFirstName(firstName);
      serviceDAO.updateUser(userToUpdate);
   }

}

DAO实施

public class UserServiceDAOImpl implements UserServiceDAOInt{
   @PersistenceContext(unitName="myUnit")
   private EntityManager entityManager;

   @Override
   public void updateUser(User user){
      entityManager.merge(user);
   }

}

我甚至不确定是否需要进行合并调用。 Spring如何知道要使用哪个EntityManager,因为在UserServiceImpl类中没有EntityManager声明?

1 个答案:

答案 0 :(得分:3)

当Service类中的方法有多个数据库调用并且我们希望所有调用都发生或者没有人应该发生时,我们用@Transactional标记一个服务层,或者我们可以说任何调用失败然后整个事务应rollback。如果我们不符合此标准,那么我们也可以在DAO层上选择@Transactional

Spring如何知道要使用哪个EntityManager,因为UserServiceImpl类中没有EntityManager声明?

Spring引用来自EntityManager的{​​{1}}(来自classpath),其结构类似于下面的内容:

persistence.xml