1

我是 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。

非常感谢

4

1 回答 1

3

您正在使用 Spring JDBC、Spring 事务,但使用 DI 的 Guice?为什么?你让事情变得比需要的复杂得多。

您的对象可能不是 Spring bean,因为 Spring 不会创建和注入它们,因此@Transactional没有效果:Spring 不会创建和注入对象,因此它不会创建和注入事务代理,因此从不使用注释任何事情。

于 2013-06-05T22:14:57.127 回答