JdbcBatchItemWriter处理具有FK关系的表

时间:2013-07-07 15:36:19

标签: spring spring-batch

我需要使用JdbcBatchItemWriter将数据插入到两个表中。

我有两个表TABLE_A,TABLE_B。

TABLE_B是具有外键关系的TABLE_A的子代。我成功地使用此批处理编写器将数据插入TABLE_A。

但是,由于FK约束,我无法知道要在TABLE_B中插入的FK值。

如果有办法在进程中获取插入TABLE_A中的记录的主键值,请告诉我,以便我可以在TABLE_B中构建一个对象和itemwrite。

2 个答案:

答案 0 :(得分:0)

我不确定JdbcBatchItemWriter开箱即用会为您提供功能,因为它使用的batchUpdate操作不会返回生成的主键,而是会影响行数。

您可能必须实现自己的编写器,在这种情况下查看this以提供有关从java sql中检索生成的ID的一般信息。

答案 1 :(得分:0)

我建议使用DAO扩展JdbcTemplate来执行此操作。

我在项目中使用SimpleJdbcInsert(DB2 drvier问题!!)时遇到了问题,所以我终于使用了这段代码!

您可以像这样实现自己的InsertAndReturnKey方法:

public Number insertAndReturnKey(final Domain param) {


    final String INSERT_SQL = "insert INTO " + DomainEnum.TABLE_NAME.value() + 
    " (" + DomainEnum.F1.value() + ","
    + DomainEnum.F2.value() + ","
    + DomainEnum.F3.value() + ","
    + DomainEnum.F4.value() + ","
    + DomainEnum.F5.value() + ","
    + DomainEnum.F6.value() + ","
    + DomainEnum.F7.value() + ") values(?,?,?,?,?,?,?)";

    log.info(INSERT_SQL);

    KeyHolder keyHolder = new GeneratedKeyHolder();
    this.update(
        new PreparedStatementCreator() {
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps =
                    connection.prepareStatement(INSERT_SQL, new String[] {SommaireReglementMetaData.ID.value()});
                ps.setString(1, param.getF1());
                ps.setString(2, param.getF2());
                ps.setLong(3, param.getF3());
                ps.setTimestamp(4, param.getF4());
                ps.setString(5, param.getF5());
                ps.setTimestamp(6, param.getF6());
                ps.setTimestamp(7, param.getF7());

                return ps;
            }
        },
        keyHolder);



    return keyHolder.getKey();
}

所以基本上,您可以使用此方法插入您的父级。然后使用batchUpdate插入所有子项。

问题:你有很多TABLE_A(父母)或只有1和许多TABLE_B记录吗?