خطأ في إدراج سجلات الوالدين والطفل الجديدة في المعاملة باستخدام الربيع JDBC
-
28-09-2019 - |
سؤال
لديّ جداولان (العنصر والرمز) مع علاقة واحدة إلى العديد (يمكن أن يحتوي عنصر واحد على العديد من الرموز - يتم تنفيذ ذلك على مستوى DB مع المفتاح الأجنبي).
عندما أحاول إدراج سجل عنصر واحد والعديد من سجلات التعليمات البرمجية (يتم ربطها بسجل العنصر) في معاملة واحدة باستخدام الربيع 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)
هنا هو إدراج بلدي في رمز 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