- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 executeBatch()
与 JDBC 一起使用来插入多行,我想获取插入行的 ID 以进行另一次插入 我为此目的使用此代码:
insertInternalStatement = dbConncetion.prepareStatement(INSERT_RECORD, generatedColumns);
for (Foo foo: foosHashSet) {
insertInternalStatement.setInt(1, foo.getMe());
insertInternalStatement.setInt(1, foo.getMe2());
// ..
insertInternalStatement.addBatch();
}
insertInternalStatement.executeBatch();
// now get inserted ids
try (ResultSet generatedKeys = insertInternalStatement.getGeneratedKeys()) {
Iterator<Foo> fooIterator= foosHashSet.iterator();
while (generatedKeys.next() && fooIterator.hasNext()) {
fooIterator.next().setId(generatedKeys.getLong(1));
}
}
它工作正常并且返回了 id,我的问题是:
如果我遍历 getGeneratedKeys()
和 foosHashSet
id 是否会以相同的顺序返回,以便从数据库返回的每个 id 都属于相应的 Foo 实例?
当我使用多线程和以上代码同时在多个线程中运行时怎么办?
还有其他解决方案吗?我有两个表 foo1 和 foo2,我想先插入 foo1 记录,然后使用它们的主 ID 作为 foo2 外键。
最佳答案
鉴于 JDBC 规范中未定义对批处理执行的 getGeneratedKeys
的支持,行为将取决于所使用的驱动程序。我希望任何支持为批量执行生成 key 的驱动程序都按添加到批处理中的顺序返回 ID。
但是,您使用 Set
的事实是有问题的。大多数集合的迭代顺序未定义,并且可以在迭代之间更改(通常仅在修改后,但理论上您不能对顺序进行任何假设)。您需要使用具有保证顺序的东西,例如 List
或者 LinkedHashSet
。
在这里应用多线程可能不是一个好主意:您应该一次只使用来自单线程的 JDBC 连接。考虑多线程要么需要正确的锁定,要么要求您拆分工作负载以便它可以使用单独的连接。这是否会改善或恶化性能很难说。
关于java - JDBC getGeneratedKeys() 方法是否始终与插入元素的顺序相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943216/
我想获取持久对象的 ID。我正在使用 EJB 3.1。 我使用准备好的语句来执行此操作并且效果很好。 ResultSet generatedKeys = statement.getGeneratedK
我将 executeBatch() 与 JDBC 一起使用来插入多行,我想获取插入行的 ID 以进行另一次插入 我为此目的使用此代码: insertInternalStatement = dbConn
我在 try-with-resources 语句中使用了 java 准备语句来访问表 在带有 NetBeans 8.0 IDE 的 Java DB 数据库中。运行 executeUpdate 方法后,
我正在升级到 Grails 2.3.9 的 Hibernate4:4.3.5.3 插件。但是,我收到一个错误: getGeneratedKeys() support is not enabled 我无
我正在尝试做一些在我使用过的每个数据库中都有效的事情。我想从插入中获取生成的 key 。我有 oracle 12c 设置并有下表: CREATE TABLE countyUsers (id integ
这段代码片段 PreparedStatement statement = connect.prepareStatement( query, Statement.RETURN_GEN
我已经了解到 mysql 中的 last_insert_id 不是池安全的。也就是说,如果你正在合并连接,你会弄乱 insert_ids。java 的 statement.getGeneratedKe
我最近从 MySQL 切换到 PostgreSQL 用于项目的后端,并发现我的一些数据库代理方法需要审查。为了插入链接对象,我使用事务来确保所有内容都已存储。我使用诸如 setAutoCommit(f
好的,我错过了什么? 我有这样一张表: CREATE TABLE PUBLIC.RESULTS (RESULTID IDENTITY NOT NULL, SOURCEID INTEGER NOT NU
我想使用 PreparedStatement INSERT 几行: ps = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED
我有一个表,其中有一列定义为自动生成键。执行以下代码时,我希望生成一个新 key ,但事实并非如此。插入一行,但 ps.getGeneratedKeys() 的结果集为空。 我正在使用 DB2:SQL
我希望 JDBI 将自动生成的主键(Long 值)转换为另一个类。 我的 DAO: @RegisterMapper(SystemIdMapper.class) public interface Sys
preparedStatement.getGeneratedKeys() 在查询只有一个 INSERT MySQL 语句时工作正常,但如果查询中有多个语句,它不会返回生成的 ID,即: test 有
我创建的表是这样的: public final String CREATE_QUESTIONS_TABLE = "CREATE TABLE Questions(QuestionID INTEGER P
我正在玩 JDBC/MySQL 5.1。我创建了一个 insert 查询来将一些数据插入到表中,并希望从新创建的行中返回生成的键。但是,当我通过“id”引用列时,这是我的 PK 和自动递增列。 Pre
Python的sqlite3模块中有没有类似于Java的statement.getGeneratedKeys()的API?如果没有,使用 sqlite3 在 Python 中获取最近自动生成的 key
我想使用插入查询检索表中最近更新的值。 这些是我的 sql 表中的数据类型。 数据类型: int(11) // primary key auto increment, not being a
我在 table 上做了一个“简单的”,它给出了这个错误。搜索网络没有帮助。 我认为使用序列作为我的主键源与我有关。 你能帮忙吗?谢谢 我正在尝试运行的代码(我已经突出显示了引发错误的部分)
我正在使用 JDBC 向 MYSQL 数据库中插入一行。我构建了一个参数化命令,执行它并尝试检索自动生成的 key ,如下所示: String sql = "INSERT IGNORE INTO `u
我有一个查询如下: String SQL = "insert into table (id, name) values (sequence.nextval, ?)"; 然后我像这样制作一个 Prepa
我是一名优秀的程序员,十分优秀!