我希望能更好地理解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);
}
}
我甚至不确定调用 merge 方法是否必要。由于 UserServiceImpl 类中没有声明 EntityManager,Spring 如何知道该使用哪个 EntityManager?
@Transactional
是合适的 - 例如,如果服务跨越多个DAO。此外,您是正确的,您不必显式调用merge。用户对象已经与持久性上下文相关联(通过调用get()
),并且在事务结束时其状态与DB同步。Merge用于更新在事务之外更改的对象。 - Ori Dar