خطأ في إدراج سجلات الوالدين والطفل الجديدة في المعاملة باستخدام الربيع JDBC

StackOverflow https://stackoverflow.com/questions/4285843

سؤال

لديّ جداولان (العنصر والرمز) مع علاقة واحدة إلى العديد (يمكن أن يحتوي عنصر واحد على العديد من الرموز - يتم تنفيذ ذلك على مستوى 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top