Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 批处理时PreparedStatement.getGeneratedKeys()返回的ResultSet的顺序是什么_Java_Postgresql - Fatal编程技术网

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

Java 批处理时PreparedStatement.getGeneratedKeys()返回的ResultSet的顺序是什么,java,postgresql,Java,Postgresql,我试图找出如何将返回的主键映射为子表类中的外键。这是我正在研究的一个例子 注意:所有代码都用于解释问题,可能无法编译。这也使用postgresql,不需要移植到其他数据库。驱动程序库是org.postgresql:postgresql:9.4.1209 这是一个示例主类记录和子表类记录信息 class Record { String id; //primary key String data; List<RecordInfo> list; } 为记录插入单

我试图找出如何将返回的主键映射为子表类中的外键。这是我正在研究的一个例子

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

这是一个示例主类记录和子表类记录信息

class Record {
    String id; //primary key
    String data;
    List<RecordInfo> list; 
}
为记录插入单独的行时,getGeneratedKeys()将返回一个结果集,其中一行包含键

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");
}
这使得很容易将记录id映射回原始对象,并将其用作每个RecordInfo中的外键。如果切换算法以批处理记录插入,返回的结果集是否与原始记录对象列表的顺序相同

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对象。是否有更好的方法映射返回的密钥?我应该考虑不分批插入吗?< /P>好问题。基于
postgresql-jdbc-42.2-5
驱动程序的源代码,看起来它们的顺序是一样的。连接源jar后,运行调试器并逐步查看驱动程序代码,以观察它如何处理
生成的键。但是,我在文档中没有看到任何关于已定义顺序的内容,因此,根据实现特定的行为,应该非常小心,通常应该避免。
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");
}