批处理时,PreparedStatement.getGeneratedKeys()返回的ResultSet的顺序是什么

时间:2018-10-18 12:52:04

标签: java postgresql

我试图弄清楚如何将返回的主键映射为子表类中的外键。这是我正在努力的一个例子。

注意:所有代码均用于解释问题,可能无法编译。这也使用了postgresql,并且不需要移植到其他数据库。驱动程序库为org.postgresql:postgresql:9.4.1209

这是示例主类Record和子表RecordInfo的示例。

class Record {
    String id; //primary key
    String data;
    List<RecordInfo> list; 
}

RecordInfo具有主键和外键。

class RecordInfo {
    String recordId; //foreign key for Record
    String id; //primary key
    String data;
}

在为Record插入单独的行时,getGeneratedKeys()将返回一个ResultSet,其中一行包含键。

String insertSql = "INSERT INTO record (data) VALUES (?)";
PreparedStatement insertPs = conn.prepareStatement(insertSql, new String[]{"id"});
...map object into insertPs...
insertPs.executeUpdate();
ResultSet rsKey = insertPs.getGeneratedKeys();
if(rsKey.next()) {
    record.id = rsKey.getString("id");
}

这很容易将Record id映射回原始对象,并将其用作每个RecordInfo中的外键。如果我将算法切换为批记录插入,返回的ResultSet是否与Record对象原始列表的顺序相同?

PreparedStatement insertPs = conn.prepareStatement(insertSql, new String[]{"id"});
for(Record record : records) {
    ...map object into insertPs...
    insertPs.addBatch();
}
insertPs.executeUpdate();
ResultSet rs = insertPs.getGeneratedKeys();
for(Record record : records) {
    rs.next();
    record.id = rs.getString("id");
}

我担心如果rs中的顺序与我的记录列表不同,我将为错误的RecordInfo对象分配外键。有没有更好的方法来映射返回的键?我应该考虑不分批插入吗?

0 个答案:

没有答案