Java 在dao层和服务层中使用@Transactional有什么区别?

Java 在dao层和服务层中使用@Transactional有什么区别?,java,spring-mvc,Java,Spring Mvc,在dao层和服务层中使用@Transactional有什么区别 @Transactional class UserDAO{} 或 我们可以将此注释放在两个层中。那么区别是什么呢?根本没有区别。但最佳实践是在服务层中使用它。因为有时您需要通过多个实体进行交易。因此,如果您在dao中手动声明事务。使用DAO中的两个方法从服务调用方法,一次调用中将有两个事务。这是您不想要的。如果您在服务层添加了@Transactional注释,并且您正在数据库上执行多个操作,那么所有这些操作都将在一个事务中,您可以

在dao层和服务层中使用
@Transactional
有什么区别

@Transactional
class UserDAO{}


我们可以将此注释放在两个层中。那么区别是什么呢?

根本没有区别。但最佳实践是在服务层中使用它。因为有时您需要通过多个实体进行交易。因此,如果您在dao中手动声明事务。使用DAO中的两个方法从服务调用方法,一次调用中将有两个事务。这是您不想要的。

如果您在服务层添加了
@Transactional
注释,并且您正在数据库上执行多个操作,那么所有这些操作都将在一个事务中,您可以确保这两个操作都已提交,如果其中任何操作失败,则回滚

例如:有一种情况下,您希望创建一名员工,而您的业务规则规定,对于您创建的每个员工,您都需要在数据库中创建用户。在这种情况下,我们将在服务层使用事务性注释

@Service
public class EmployeeService {

    ....

    @Transactional
    public int createEmployee(Employee emp) {
        //create Employee
        employeeDao.createEmployee(emp);

        User user = new User();
        // some fileds of employee are used to create a User
        user.setEmployeeId(emp.getEmployeeId());
        ....

        userDao.createUser(user);
        ...
    }
}
可能重复的
@Service
public class EmployeeService {

    ....

    @Transactional
    public int createEmployee(Employee emp) {
        //create Employee
        employeeDao.createEmployee(emp);

        User user = new User();
        // some fileds of employee are used to create a User
        user.setEmployeeId(emp.getEmployeeId());
        ....

        userDao.createUser(user);
        ...
    }
}