Проблема с ограничением целостности в спящем режиме (JpaRepository) при обновлении реестра - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть две таблицы в базе данных, A и B. Определены следующим образом:

CREATE TABLE A (
id NUMBER,
Name VARCHAR(100),
  CONSTRAINT pk_id PRIMARY KEY (id)
);

CREATE TABLE B (
id NUMBER,
a_id NUMBER,
  CONSTRAINT pk_id PRIMARY KEY (id),
  CONSTRAINT id_a_id FOREIGN KEY (a_id) REFERENCES a(id)
);

Что я хочу сделать, это использовать JpaRepository обновить регистр "давайте предположим, с id: 5" изтаблица A, когда таблица B имеет регистр с a_id: 5.

. Для этого первое, что я попытался сделать, это попытаться получить сущность из базы данных A, изменить значение Name, удалить старый регистр исохранить новый с изменениями:

@Transactional
void update()
{
 List<A> oldARegisterList = a.findById(5);
 A oldARegister = oldARegisterList.get(0);
 A newRegister = new A(oldARegister);
 a.delete(oldARegister);
 newRegister.setName("NewName");
 a.save(newRegister);
}

Но я получаю ORA-02291: ограничение целостности (id_a_id) нарушено - родительский ключ не найден.

Затем я попытался удалитьрегистр в B, удалите и создайте регистр в A с новым именем и, наконец, снова создайте регистр в B:

@Transactional
void update()
{
 List<A> oldARegisterList = a.findById(5);
 A oldARegister = oldARegisterList.get(0);
 B oldBRegister = oldARegister.getB();
 b.delete(oldBRegister);
 A newRegister = new A(oldARegister);
 a.delete(oldARegister);
 newRegister.setName("NewName");
 a.save(newRegister);
 b.save(oldBRegister);
}

Это не работает эфир, что создает ту же проблему, но если я выполнюсначала вручную удаляется регистр B, затем обновляется регистр A и, наконец, воссоздается регистр B, он работает.

Так что кажется, что если процесс удаления B обновляет A и воссоздает B, происходит втот же трОтвет: процесс не работает.

Как можно сделать это в одной транзакции?

Большое спасибо.

1 Ответ

0 голосов
/ 17 декабря 2018

В качестве первого замечания я должен заметить, что вы можете просто обновить oldARegister имя, не удаляя oldBRegister, потому что имя не является первичным ключом на A, поэтому просто используйте это:

oldARegister.setName("New Name");
a.save(oldARegister);

Но если вы хотитечтобы сделать это на своем пути, вы должны установить A от oldBRegister до newRegister следующим образом:

oldBRegister.setA(newRegister)
b.save(oldBRegister);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...