У меня есть база данных, в которой хранятся отношения «один ко многим» между «Родителем» и «Ребенком», где у родителя может быть несколько детей.Дочерняя таблица содержит ссылку на родителя через ограничение внешнего ключа.Вот запросы к таблице:
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) даже не существует в родительской таблице.Чего я не понимаю, так это почему или как я получаю обратно идентификатор после вставки одной строки, который не является точным, особенно после того, как ранее были созданы успешные ссылки.