我需要使用JdbcBatchItemWriter将数据插入到两个表中。
我有两个表TABLE_A,TABLE_B。
TABLE_B是具有外键关系的TABLE_A的子代。我成功地使用此批处理编写器将数据插入TABLE_A。
但是,由于FK约束,我无法知道要在TABLE_B中插入的FK值。
如果有办法在进程中获取插入TABLE_A中的记录的主键值,请告诉我,以便我可以在TABLE_B中构建一个对象和itemwrite。
答案 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记录吗?