Как обрабатывать ограничения родительского ключа в транзакциях jdbc? - PullRequest
0 голосов
/ 02 октября 2010

У меня есть 2 таблицы с именами T1 и T2.Где T1 - родитель, а T2 - дочерний.Сценарий таков: я запустил транзакцию jdbc, затем вставил строку в T1, а затем попытался вставить строку в T2.Вставка строки в T2 выдает мне исключение «Integrity Constraint-Parent key not found».

Как мне справиться с этим сценарием?

 Connection con;
try{
  con = ConnectionPool.getConnection();
  con.setAutoCommit(false);
  int T1Id = getNewId("T1"); // from sequence;
  int T2Id = getNewId("T2"); // from sequence;
  Insert in to table T1(t1Id,tName) values (T1Id,'A')
  Insert in to table T2(t2Id, t1Id,tName) values (T2Id,T1Id,'A')//Here, Exception raises

  con.commit();

 }catch(Exception e){
    try {con.rollback();} catch (SQLException e) {}

 }finally{
     try {con.setAutoCommit(true);} catch (SQLException e) {}
     ConnectionPool.returnConnection(con);
}

Используя JDBC API, struts1.2, Oracle10 G Database

Ответы [ 2 ]

1 голос
/ 02 октября 2010

Вы, вероятно, делаете что-то не так.Если обе вставки находятся в одной транзакции, то, что вы только что упомянули, не может произойти.Пожалуйста, поделитесь кодом и дополнительной информацией (сервер БД, структура таблиц), чтобы узнать, можем ли мы вам помочь.

0 голосов
/ 02 октября 2010

Вам необходим трехэтапный процесс:

  1. ВСТАВИТЬ строку в родительский
  2. ВЫБРАТЬ сгенерированный ключ из родительского
  3. Использовать сгенерированный ключ и дочернюю информациюВСТАВИТЬ в ребенка

Это должна быть одна единица работы, поэтому сделайте ее транзакционной.

Невозможно определить из вашего псевдокода.Также было бы полезно узнать, используете ли вы автоматически сгенерированные ключи.

Я предполагаю, что первичный ключ, который вы предполагаете для T1, на самом деле не появляется.Если T2 говорит, что внешний ключ не может быть нулевым или требуется, и он не появляется в T1, то система RDBMS должна пожаловаться и выдать исключение.

...