2013-06-05 26 views
1

我是Spring JDBC的新手。我创建了具有一样的界面,一个DAO:如何在Guice中使用Spring JDBC中的事务

@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

如果你说它没有回滚,那么'@ Transactional'配置不正确。 –

+0

@Kevin你最终得到了什么地方?我正在使用Guice作为DI,并希望使用Spring JDBC +交易 – Alden

回答

3

你使用Spring JDBC,Spring的事务中,但对于吉斯DI?为什么?你正在使事情变得比需要复杂得多。

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

+1

感谢您的回答。使用Guice是我的团队的要求之一,这不是我可以改变的。如果Spring JDBC不能像这样工作,那么Spring可以提供什么替代方法?我确实考虑过JOOQ,但它似乎根本没有提供交易支持。 – Kevin

相关问题