Ссылочный объект должен быть обновлен, если указанный объект сохранен? - PullRequest
0 голосов
/ 14 февраля 2019

Представьте себе следующую ситуацию: у нас есть две таблицы базы данных, Арендатор и Дом .Ссылки на арендаторов House с отображением @ManyToOne.

Tenant tenant = tenantRepository.findById(id).orElseThrow();
House house = tenant.getHouse();

house.setPrice(340_000);
house = houseRepository.save(house); // A new instance is returned by the CrudRepository::save() method

// TODO Is this necessary for further use?
tenant.setHouse(house);

// Further use...
tenant.setAge(23);
tenant = tenantRepository.save(tenant); // Otherwise it is saved with the old reference where house's ID can be null?
...

Нужно ли обновлять Арендатора новой ссылкой House?

РЕДАКТИРОВАТЬ: Для пояснения вы можете предположить, что объекты были загружены (следовательно, в управляемом состоянии) непосредственно перед приведенным выше кодом.И поскольку эта «транзакция» является частью функции Spring @RequestMapping, транзакция будет неявно зафиксирована в конце ее.

РЕДАКТИРОВАТЬ 2: Вопрос не должен ли я вообще спасать дом или нет, чтобы избежать этой ситуации.Речь идет о лучшем понимании того, как управляются объекты.

--- Но вы также можете сказать мне, должен ли я сначала обновить все и сохранить в конце, так какобычная практика?

1 Ответ

0 голосов
/ 14 февраля 2019

Критический вопрос: house и tenant уже управляемые объекты?

Если да (потому что они были загружены в той же транзакции, которая все еще выполняется), то все задействованные экземпляры House являютсято же самое, и вам не нужно устанавливать house в tenant.Но в этом случае вам даже не нужно вызывать save.

Если это отдельные экземпляры, да, вам нужно позвонить tenant.setHouse(house);.Без него вы получите либо исключение, либо перезапишите изменения на house, в зависимости от настройки каскада в отношении.

Предпочтительный способ сделать все это:

В пределаходиночная транзакция:

  • загрузка сущностей
  • манипулирование ими по желанию
  • принятие транзакции

JPA будет отслеживать изменения всущностей и сбросить их в базу данных перед фактическим совершением транзакции базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...