gpt4 book ai didi

spring - 使用 Spring JDBC 在事务中插入新的父子记录时出错

转载 作者:行者123 更新时间:2023-12-04 06:40:41 25 4
gpt4 key购买 nike

我有 2 个表(项目和代码),它们是一对多的(一个项目可以有多个代码 - 这是在数据库级别使用外键实现的)。

当我尝试使用 spring JDBC 在一个事务中插入一个项目记录和几个代码记录(它们链接到该项目记录)时,我得到

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`mrbcodes`.`code`, CONSTRAINT `code_item_fk` FOREIGN KEY (`itemId`) REFERENCES `item` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

这是我插入数据库代码。
public void saveCode(Code code, long itemId) {
String insertSql = "insert into code(number, value, itemId) values (:number,:value,:itemId)";
SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(code);
log.info("Inserting values into code table; number:" + code.getNumber() +"; value:" + code.getValue()
+ "; itemId:" + itemId);
simpleJdbcTemplate.update(insertSql, namedParameters);
}

@Transactional
public void saveCodes(Collection <Code> codes) {
KeyHolder keyHolder = new GeneratedKeyHolder();
insertNewItem(keyHolder);
Number key = keyHolder.getKey();
Assert.notNull(key, "After item insert; returned key must not be null");
for (Code code:codes) {
saveCode(code, key.longValue());
}
}

private KeyHolder insertNewItem(KeyHolder keyHolder) {
String createItemSQL = "insert into item(timeUsed) values(:defaultValue)";
SqlParameterSource sqlParameterSource = new MapSqlParameterSource("defaultValue", defaultValue);
log.debug("Inserting new item");
simpleJdbcTemplate.getNamedParameterJdbcOperations().update(createItemSQL,sqlParameterSource, keyHolder);
log.debug("Item inserted; keyHolder " + keyHolder);
return keyHolder;
}

最佳答案

你不使用 itemIdsaveCode ,因此 Code保存时没有 itemId .

关于spring - 使用 Spring JDBC 在事务中插入新的父子记录时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4285843/

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