我试图弄清楚如何将返回的主键映射为子表类中的外键。这是我正在努力的一个例子。
注意:所有代码均用于解释问题,可能无法编译。这也使用了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对象分配外键。有没有更好的方法来映射返回的键?我应该考虑不分批插入吗?