我是Spring JDBC的新手。我创建了一个DAO,其界面如下:
@ImplementedBy(StuffDAOImpl.class)
public interface StuffDAO {
void createStuff(StuffDTO stuffDTO);
@Transactional
void updateStuff(StuffDTO stuffDTO);
}
如何将updateStuff配置为事务性,例如,如果方法中有两个更新:
@Override
@Transactional
public void updateStuff(StuffDTO stuffDTO) {
String query = "UPDATE stuff SET (name, username, password) = (?, ?, ?) WHERE rowid = 10";
getJdbcTemplate().update(query, new Object[]{"John", "john", "12345"});
// This will fail
try {
String wrongquery = "UPDATE tablenotexist SET (name, username, password) = (?, ?, ?) WHERE rowid = 10";
getJdbcTemplate().update(wrongquery, new Object[]{"John", "john", "12345"});
}catch (BadSqlGrammarException e) {
// IGNORE
}
}
在上面的示例中,第二个查询将失败,因为它尝试更新不存在的表。我认为通过声明此方法作为一个事务,它应该服务于目的。但它似乎没有用。
如果此方法运行,如何使查询也回滚?
顺便说一句,我使用Guice而不是Spring来做DI。
非常感谢
答案 0 :(得分:3)
您正在使用Spring JDBC,Spring交易,但是Guice用于DI?为什么?你制造的东西比需要的要复杂得多。
你的对象可能不是Spring bean,因为Spring没有创建和注入它们,所以@Transactional
没有效果:Spring不会创建和注入对象,因此它不会创建和注入事务代理,因此注释永远不会被任何东西使用。