【问题标题】:Spring mvc: Transactional annotationSpring mvc:事务注解
【发布时间】:2012-12-17 10:21:50
【问题描述】:

我有两个表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
        }

现在我想在插入employeeaddress 表属性时实现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 吗?

【问题讨论】:

    标签: java spring spring-mvc transactions


    【解决方案1】:

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

    您可以结合 jdbctemplate here阅读有关 @transactional 的信息

    【讨论】:

    • 我进行了编辑。你可以看看它并发表评论,如果它应该是这样的吗?
    • 看起来不错,传播支持意味着如果事务已经存在,则应使用该事务。所以如果你有一个服务调用另一个服务,他们仍然只使用一个事务。如果该服务调用中没有发生任何修改,则应将 Readonly 设置为 true。由于这个标志,一些数据库能够优化它们的锁定行为。
    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 2012-12-14
    • 2018-03-28
    • 2015-11-18
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多