我有两张表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
}
现在我想在插入Transactional
和employee
表属性时实现address
。我在这里感到困惑。 @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?
答案 0 :(得分:3)
尽管@Transactional注释可以完成这项工作,但事务通常是在服务级别定义的。这样一个业务调用就在一个事务中,确保一切成功或失败。
你可以结合jdbctemplate here了解@transactional