Derby getGeneratedKey () возвращает неправильное значение при вставке отношения один ко многим - PullRequest
0 голосов
/ 12 июня 2018

У меня есть база данных, в которой хранятся отношения «один ко многим» между «Родителем» и «Ребенком», где у родителя может быть несколько детей.Дочерняя таблица содержит ссылку на родителя через ограничение внешнего ключа.Вот запросы к таблице:

CREATE TABLE Parent (
  id INT GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(55),
  CONSTRAINT pk_parent_id PRIMARY KEY (id)
)

CREATE TABLE Child (
  id INT GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(55),
  parent INT CONSTRAINT fk_parent REFERENCES Parent
  CONSTRAINT pk_child_id PRIMARY KEY (id)
)

Мой java-код перебирает родительский список, где он сначала вставляет родителя в базу данных, чтобы я мог получить ID родительского кода для использованиядля связи с ребенком:

Statement s = this.conn.getStatement();
s.executeUpdate("INSERT INTO Parent (name) VALUES ('John')", 
    Statement.RETURN_GENERATED_KEYS);
ResultSet r = s.getGeneratedKeys();
r.next();
int parentId = r.getInt(1);
r.close();
s.close();

Теперь, когда у меня есть родительский идентификатор, я перебираю дочерние элементы этого родителя (список в родительском POJO).Код практически идентичен, за исключением получения идентификатора дочернего элемента и установки его собственных значений.Запросы выглядят так:

s.executeUpdate("INSERT INTO Child (name, parent) VALUES ('Rocky'," + 
    parentId + ")");

Выполнение этой последовательности будет работать большую часть времени, но в конечном итоге происходит некоторое поведение, когда идентификатор, возвращаемый при получении сгенерированного идентификатора из запроса родительской вставки, не ссылаетсяправильный родительский идентификатор.Это приведет к возникновению этого исключения:

java.sql.SQLIntegrityConstraintViolationException: INSERT on table 'CHILD' caused a violation of foreign key constraint 'fk_parent_id' for key (97). The statement has been rolled back.

Я проверил базу данных после этого и заметил, что идентификатор нарушения (в данном случае 97) даже не существует в родительской таблице.Чего я не понимаю, так это почему или как я получаю обратно идентификатор после вставки одной строки, который не является точным, особенно после того, как ранее были созданы успешные ссылки.

...