无法使用spring jdbc模板和声明式事务appraoch将记录插入到两个表中

时间:2014-07-06 09:53:13

标签: java mysql spring-jdbc

我试图使用spring jdbc模板和事务方法将记录插入到不同的表中但不能这样做。

代码看起来像.............

@Transactional
    public void insertIntoTwoTables(){  




        final KeyHolder keyHolder = new GeneratedKeyHolder();

        insertRole(keyHolder);
        final String person = "insert into person (first_name, last_name, description, role_id) values ('?,?,?,?)";
        keyHolder.getKey().longValue();
        jdbcTemplate.update(new PreparedStatementCreator() {

            @Override
            public PreparedStatement createPreparedStatement(Connection con)
                    throws SQLException {
                PreparedStatement ps = con.prepareStatement(person);
                ps.setObject(1, "sahil");
                ps.setObject(2, "Goyal");
                ps.setObject(3, "This is again test");
                ps.setObject(4, keyHolder.getKey().longValue());
                return ps;
            }
        });
    }

    private KeyHolder insertRole(KeyHolder keyHolder){
        final String role = "insert into role (name, code) values (?,?)";
        jdbcTemplate.update(new PreparedStatementCreator() {

            @Override
            public PreparedStatement createPreparedStatement(Connection con)
                    throws SQLException {
                PreparedStatement ps = con.prepareStatement(role, new String[]{"id"});
                ps.setObject(1, "Manager");
                ps.setObject(2, "MANAGER");
                return ps;
            }
        }, keyHolder);

        return keyHolder;
    }

当我运行此代码时,它运行完全正常,但不会在数据库中插入任何内容。 当我使用@Transactional注释运行它时会发生此问题。如果我删除然后它工作正常。所以我可以在交易环境中完成这项任务。

配置文件如下所示

<bean id="bDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="username" value="postgres" />
        <property name="password" value="postgres" />
        <property name="url" value="jdbc:postgresql://localhost:5432/test" />
        <property name="defaultAutoCommit" value="true" />
    </bean>

我在两种情况下测试代码             

但它不会在数据库中嵌入任何内容。

0 个答案:

没有答案