2

我有两张桌子EmployeeAddress如图所示:

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在插入employeeaddress表属性时实现。我在这里有点困惑。方法上的注释是否@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 吗?

4

1 回答 1

3

尽管@Transactional 注释可以完成这项工作,但事务通常是在服务级别上定义的。这样,一个业务调用就在一个事务中,确保一切成功或失败。

您可以在此处阅读与 jdbctemplate 结合使用的 @transactional

于 2012-12-17T10:28:14.147 回答