我有两个表Employee
和Address
,如图所示:
public class Employee {
private Integer id;
private String firstName;
private String lastName;
private boolean employeeStatus;
private Address address;
//getters setters
}
public class Address {
private Integer id;
private String country;
private String city;
private String street;
private Integer emp_id;
//getters setters
}
@Repository("employeeDao")
public class EmployeeDaoImpl implements EmployeeDao {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void insertEmployee(Employee e)
{
String sql = "INSERT INTO tbl_employee (dept_id,firstName,lastName,employeeStatus) values(?,?,?,?,?)";
this.jdbcTemplate.update(sql,new
Object[]{e.getDept_id(),e.getFirstName(),e.getLastName(),e.isEmployeeStatus()});
// INSERT ADDRESS????
}
// Other Methods
}
现在我想在插入employee
和address
表属性时实现Transactional
。我在这里有点困惑。该方法上的 @transactional 注释是否完成了所需的工作?到目前为止我明白了。另外,从我插入 employee
属性的位置插入地址是最佳实践吗?我还在某处读到事务应该从服务层而不是 Dao 实现。在这种情况下如何实现事务?
编辑
由于推荐在服务层使用@transactional
,服务层就变成了:
@Service("employeeService")
@Transactional
public class EmployeeServiceImpl implements EmployeeService{
@Autowired
EmployeeDao employeeDao;
@Autowired
AddressDao addressDao;
@Override
public void insertEmployee(Employee e) {
employeeDao.insertEmployee(e);
addressDao.insertAddress(e.address);
}
}
这是执行事务的正确方式吗?任何人都可以解释 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
而不是普通的 @Transactional 吗?
最佳答案
尽管 @Transactional 注释可以完成这项工作,但事务通常是在服务级别上定义的。这样,一个业务调用就在一个事务中,确保所有事情都成功或失败。
您可以结合jdbctemplate here阅读@transactional
关于java - Spring MVC : Transactional annotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13912232/