スプリングJDBCを使用したトランザクションに新しい親子記録を挿入するエラー
-
28-09-2019 - |
質問
2つのテーブル(アイテムとコード)があり、1つは多くのテーブル(1つのアイテムには多くのコードを持つことができます。これは、外部キーを使用してDBレベルで実装されています)。
Spring JDBCを使用して1つのトランザクションで1つのアイテムレコードといくつかのコードレコード(そのアイテムレコードにリンクされています)を挿入しようとしているとき
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)
これが私のDBコードへの挿入です。
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;
}
解決
あなたは使用しません itemId
の saveCode
, 、 したがって Code
なしで保存されます itemId
.
所属していません StackOverflow