我有一个需求,其中我必须通过3个DAO类插入3个独立的表。春季多笔交易回滚
ClassADAO
ClassBDAO
ClassCDAO
我想为所有的三类一个单一的交易,这样,如果一个失败,插入我想回滚通过前面的类插入了完整的事务。
我有配置XML如下所示
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"></property>
<property name="username" value="******"></property>
<property name="password" value="********"></property>
</bean>
在控制器注解如下
@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED)
但仍然如果ClassCDAO失败,我可以在分贝Ç插入从ClassA的和B类
控制器:
@Controller
@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED)
public class MyController{
@Autowired
private MyBusinessLayer mybusinessLayer;
@RequestMapping(value = "/register.htm", method = RequestMethod.POST)
public String saveRegistration(
final @ModelAttribute("registration") @Valid Registration registration,
final BindingResult result, final Model model) {
if (result.hasErrors()) {
return "myPage";
} else {
mybusinessLayer.saveRegistration(registration);
}
return "myPage";
}
}
我的业务层:
@Component
public class MyBusinessLayer{
@Autowired
private ClassA classA;
@Autowired
private ClassB classB;
@Autowired
private ClassC classC;
public void saveRegistration(Registration registration) {
Company company = RegistrationHelper.buildCompany(registration);
classA.saveCompany(company);
Contact contact = RegistrationHelper.buildContact(registration, company.getCompanyId());
classB.saveContact(contact);
User user = RegistrationHelper.buildUser(registration, contact.getCompanyID(),
contact.getContactID());
classC.saveUser(user);
}
}
ClassADAO:
@Component
public class CompanyDAOImpl implements CompanyDAO {
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
@Override
public void saveCompany(Company company) {
String insertCompanySQL = //insert statement;
//code here
SqlParameterSource paramSource = new MapSqlParameterSource(bind);
namedParameterJdbcTemplate.update(insertCompanySQL, paramSource);
}
}
ClassBDAO和ClassCDAO也如上所示。
请显示所有相关代码。在这种情况下,调用DAO方法。 – Nikem
@Nikem:更新我的问题本身的代码 – Pathfinder