gpt4 book ai didi

java - JDBC : foreign key on PK created in same transaction

转载 作者:可可西里 更新时间:2023-11-01 06:30:35 25 4
gpt4 key购买 nike

我的 MySQL 数据库中有两个表,它们是这样创建的:

CREATE TABLE table1 (
id int auto_increment,
name varchar(10),
primary key(id)
) engine=innodb

CREATE TABLE table2 (
id_fk int,
stuff varchar(30),
CONSTRAINT fk_id FOREIGN KEY(id_fk) REFERENCES table1(id) ON DELETE CASCADE
) engine=innodb

(这些不是原始表。关键是table2有一个外键引用表1中的主键)

现在在我的代码中,我想在一个事务中向两个表添加条目。所以我将 autoCommit 设置为 false:

    Connection c = null;        

PreparedStatement insertTable1 = null;
PreparedStatement insertTable2 = null;

try {
// dataSource was retreived via JNDI
c = dataSource.getConnection();
c.setAutoCommit(false);

// will return the created primary key
insertTable1 = c.prepareStatement("INSERT INTO table1(name) VALUES(?)",Statement.RETURN_GENERATED_KEYS);
insertTable2 = c.prepareStatement("INSERT INTO table2 VALUES(?,?)");

insertTable1.setString(1,"hage");
int hageId = insertTable1.executeUpdate();

insertTable2.setInt(1,hageId);
insertTable2.setString(2,"bla bla bla");
insertTable2.executeUpdate();

// commit
c.commit();
} catch(SQLException e) {
c.rollback();
} finally {
// close stuff
}

当我执行上面的代码时,出现异常:

MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails

在我提交之前,似乎主键在事务中不可用。

我是不是漏掉了什么?我真的认为生成的主键应该在事务中可用。

该程序使用 mysql-connector 5.1.14 和 MySQL 5.5.8 在 Glassfish 3.0.1 上运行

非常感谢任何帮助!

问候,黑格

最佳答案

你错过了返回的更新 id 的一些东西,你必须这样做:

Long hageId = null;

try {
result = insertTable1.executeUpdate();
} catch (Throwable e) {
...
}

ResultSet rs = null;

try {
rs = insertTable1.getGeneratedKeys();
if (rs.next()) {
hageId = rs.getLong(1);
}
...

关于java - JDBC : foreign key on PK created in same transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com