2

Webアプリの一部として、登録プロセスを構築しようとしています。プロセスを検証した後、実行する3つのSQLステートメントがあります。いずれかが失敗した場合は、すべてロールバックする必要があります。ただし、意図的に3番目のSQLを記述して失敗した場合(存在しないテーブル名を使用)。例外がスローされているのがわかりますが、1番目と2番目のswlステートメントはロールバックされません。

誰かがこれをどのように行うべきかについて私にアドバイスできますか?

私のapplication-context.xmlから

    <bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="userDAO" class="com.doyleisgod.golf.database.JdbcUserDao">
      <property name="dataSource" ref="dataSource"></property>
    </bean>

    <bean id="registration" class="com.doyleisgod.golf.services.Registration"/>

    <tx:annotation-driven /> 

私の登録サービスクラス

public class Registration implements IRegistration {
@Autowired JdbcUserDao userDAO;

@Override
@Transactional (rollbackFor = Exception.class)
public boolean registerUser(Object command) {
    return userDAO.registerUser(command);
}
}

私のuserDAO登録方法

    public boolean registerUser(Object command)  {
    try {
        setUserCommand(command);
        sql = "INSERT INTO users (USERNAME,PASSWORD, ENABLED)VALUES ('"+username+"', '"+EncryptedPassword+"', TRUE);";
        getSimpleJdbcTemplate().update(sql);

        sql = "INSERT INTO user_roles (USERNAME,AUTHORITY)VALUES ('"+username+"', 'ROLE_USER');";
        getSimpleJdbcTemplate().update(sql);

        sql = "INSERT INTO users_details (USERNAME,FIRST_NAME, LAST_NAME, EMAIL_ADDRESS, HANDICAP)VALUES ('"+username+"', '"+firstname+"', '"+lastname+"', '"+email+"', '"+handicap+"');";
        getSimpleJdbcTemplate().update(sql);

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
        return true;
}

スローされる例外の例

    15-Feb-2012 21:13:48 org.springframework.jdbc.support.SQLErrorCodesFactory <init>
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [INSERT INTO users_details (USERNAME,FIRST_NAME, LAST_NAME, EMAIL_ADDRESS, HANDICAP)VALUES ('d', 'd', 'd', 'd', '0');]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'golf.users_details' doesn't exist

誰かが私が逃したものを教えてもらえますか?3番目のSQLステートメントが失敗したときに、他の2つのトランザクションがロールバックされないのはなぜですか?

4

1 に答える 1

5

DAOで例外をキャッチしているため、TransactionManagerにはスローされません。

于 2012-02-15T21:23:49.443 に答える