2013-07-07 1 views
3

У меня есть требование вставить данные в две таблицы, используя JdbcBatchItemWriter.Обработка JdbcBatchItemWriter в таблицах, имеющих отношение FK

У меня есть две таблицы TABLE_A, TABLE_B.

TABLE_B является дочерним по отношению к TABLE_A с отношением внешних ключей. Мне удастся вставить данные с помощью этого сценария в TABLE_A.

Однако из-за ограничения FK я не могу знать значение FK для вставки в TABLE_B.

Пожалуйста, дайте мне знать, если есть способ получить значения первичного ключа для записей, вставленных в TABLE_A во время процесса, чтобы я мог построить объект и itemwrite в TABLE_B.

+0

Кроме того, я хотел упомянуть, что PK для TABLE_A представляет собой последовательность, которая генерируется автоматически. Следовательно, даже когда я пытаюсь использовать CompositeItemWriter, я не могу повторно использовать объект для следующих авторов таблиц. Однако я попытался сначала вставить данные для TABLE_A, используя simpleJdbcInsert, и получить значение PK, а затем использовать JDBCBatchWriter для записи других таблиц. Этот подход, кажется, требует больше времени, который поражает производительность, когда есть огромные записи. Цените, если вы думаете об этом. – skanda

+0

Я реализую то же самое и придерживаюсь той же ситуации, если вы найдете какой-либо способ? – TaherT

ответ

0

Я не уверен, что JdbcBatchItemWriter предоставит вам возможность, поскольку он использует операцию batchUpdate, которая вместо этого не возвращает вам сгенерированный первичный ключ, но вместо этого влияет количество строк.

Возможно, вам придется реализовать свой собственный сценарий, в этом случае взгляните на this, чтобы получить представление об общем извлечении генерируемых идентификаторов из java sql.

+0

Спасибо. В настоящее время я использую мой запрос как INSERT INTO TEST_A (TESTA.nextval, NAME) Время, затрачиваемое на вставку записей при использовании этого способа, меньше, чем когда я пишу свой пользовательский писатель. Так будет ли возможность использовать этот идентификатор последовательности для дочерних таблиц. Пожалуйста, порекомендуйте. – skanda

+0

этот подход «оставляет» идентификатор (TESTA.nextval) внутри области базы данных и, как таковой, недоступен для уровня приложения. если вы используете вставку из двойного (nextval), вам может понадобиться посмотреть, что вторая таблица заполнена «insert into ... select from», используя столбец «name» в качестве критериев «где». –

0

Я бы рекомендовал использовать DAO для расширения JdbcTemplate.

У меня возникла проблема с использованием SimpleJdbcInsert (проблема DB2 drvier !!) в моем проекте, поэтому я, наконец, использовал этот код!

Вы можете реализовать свой собственный метод InsertAndReturnKey так:

public Number insertAndReturnKey(final Domain param) { 


    final String INSERT_SQL = "insert INTO " + DomainEnum.TABLE_NAME.value() + 
    " (" + DomainEnum.F1.value() + "," 
    + DomainEnum.F2.value() + "," 
    + DomainEnum.F3.value() + "," 
    + DomainEnum.F4.value() + "," 
    + DomainEnum.F5.value() + "," 
    + DomainEnum.F6.value() + "," 
    + DomainEnum.F7.value() + ") values(?,?,?,?,?,?,?)"; 

    log.info(INSERT_SQL); 

    KeyHolder keyHolder = new GeneratedKeyHolder(); 
    this.update(
     new PreparedStatementCreator() { 
      public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { 
       PreparedStatement ps = 
        connection.prepareStatement(INSERT_SQL, new String[] {SommaireReglementMetaData.ID.value()}); 
       ps.setString(1, param.getF1()); 
       ps.setString(2, param.getF2()); 
       ps.setLong(3, param.getF3()); 
       ps.setTimestamp(4, param.getF4()); 
       ps.setString(5, param.getF5()); 
       ps.setTimestamp(6, param.getF6()); 
       ps.setTimestamp(7, param.getF7()); 

       return ps; 
      } 
     }, 
     keyHolder); 



    return keyHolder.getKey(); 
} 

Так basicaly, вы можете использовать этот метод для вставки родителя. затем используйте batchUpdate для вставки всех дочерних элементов.

Вопрос: У вас много TABLE_A (родителей) или всего 1 и много записей TABLE_B?

+0

У меня есть одна запись в TABLE_A, которая это родительская таблица и множество записей в TABLE_B (дочерние таблицы). Для него существует множество дочерних таблиц, таких как TABLE_C, TABLE_D, у которого есть отношение FK к TABLE_A. – skanda

+0

Как вы получили Spring Batch, чтобы затем использовать DAO в качестве писателя? – BrianC

+0

@BrianC, вы только автоувеличиваете это в своем определенном писателе. – Cygnusx1

 Смежные вопросы

  • Нет связанных вопросов^_^