4

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

我有两个表 TABLE_A、TABLE_B。

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

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

请让我知道是否有一种方法可以在此过程中获取插入到 TABLE_A 中的记录的主键值,以便我可以构建一个对象并将 itemwrite 到 TABLE_B 中。

4

2 回答 2

0

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

您可能必须实现自己的编写器,在这种情况下,请查看内容以提供有关从 java sql 中检索生成的 id 的见解。

于 2013-07-08T12:57:44.320 回答
0

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

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

您可以像这样实现自己的 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 记录?

于 2013-07-09T13:36:59.607 回答