Java 跟踪SQL中的新主键

Java 跟踪SQL中的新主键,java,sql,sqlite,jdbc,transactions,Java,Sql,Sqlite,Jdbc,Transactions,抱歉,这是一个很长的问题,但它涉及到数据库的一般问题: 我使用sqlite/jdbc(在本例中),并且我试图跟踪在向表中添加行时创建的自动ID。数据库有一个主表“Person”,其他表称为“training”和“inclution”。其想法是将人员姓名和其他基本细节放入“人员”表中,一人多人有许多“培训”和“入职培训”。因此,我可以通过选择*FROM inclutions,person_ID=WHERE,查找给定人员的所有入职培训 问题是在创建数据库时,我必须添加一个人,然后跟踪他们获得的自动递

抱歉,这是一个很长的问题,但它涉及到数据库的一般问题:

我使用sqlite/jdbc(在本例中),并且我试图跟踪在向表中添加行时创建的自动ID。数据库有一个主表“Person”,其他表称为“training”和“inclution”。其想法是将人员姓名和其他基本细节放入“人员”表中,一人多人有许多“培训”和“入职培训”。因此,我可以通过选择*FROM inclutions,person_ID=WHERE,查找给定人员的所有入职培训

问题是在创建数据库时,我必须添加一个人,然后跟踪他们获得的自动递增ID,然后在另一个表中以该ID作为外键创建条目:

所以

然后

我希望与数据库的交互是“原子的”,所以我想做

prepPerson.executeBatch();
prepInductions.executeBatch();
id++;
我意识到可以改为添加人员,执行getGeneratedKeys(),然后添加具有新人员正确行id的归纳,但我不希望在添加人员之后但在归纳之前出现异常。如果发生这种情况,那么我将不得不回滚时间并移除该人员

目前,我知道我每次都从外部源重新创建数据库,我用一个局部整数变量跟踪行id,我知道这很危险


这种情况难道没有一个普遍的解决办法吗?还是我很担心与数据库的“原子”交互?

对于这样的场景,一般框架是

Begin A Transaction

 Create your primary entry
 Collect the auto-generated key
 Create your child entries

Commit The Transaction
然后,如果任何步骤失败,您就可以
回滚事务


在SQLite中,我相信
last\u insert\u rowid()
可以用于在第一次插入后获取自动生成的id。

请使用
getGeneratedKeys()
检索生成的id

要保持数据完整性,请使用事务。通常,JDBC使用“自动提交”模式,但在这种情况下,您需要手动处理事务

在连接上调用
.setAutoCommit(false)
,并使用
.commit()
.rollback()
提交或放弃更改


(检查Javadoc)。

您可以使用上面提供的代码,但请确保自动提交已关闭。然后,您需要在加载该人员的所有导入后手动提交事务。或者在遇到错误时将其回滚


这是完全原子化的。

请澄清一下为什么好的旧事务不适合您。AFAIK sqlite支持它们,setAutocommit(false)将隐式启动一个新事务。您是说
rollback()
而不是
abort()
(后者旨在强制关闭连接)?感谢大家的快速响应。它现在正在点击自动提交的内容。我在执行批处理之前将其设置为false,在执行批处理之后将其设置为true,正如一个示例所示,我没有确切地了解原因-我根本没有
.commit()
,但它仍然有效。那么,一旦完成,您可以执行多个
.executeBatch()
es,然后执行一个
.commit()
?这正是我需要的。已解决。@Mike对处于活动事务中的连接调用
autoCommit(true)
将调用
commit()
(如javadoc中所述)。@Mark。是的,这似乎很有效。(还有,刚刚学会了关闭结果集的缓慢方法。)再次感谢大家。
prepPerson.executeBatch();
prepInductions.executeBatch();
id++;
Begin A Transaction

 Create your primary entry
 Collect the auto-generated key
 Create your child entries

Commit The Transaction