В двунаправленных отношениях вы определяете отображение. Когда вы вносите изменения в это отображение, очевидно, что произойдет - внешний ключ будет обновлен. Поскольку существует только одно сопоставление, не может быть никакого конфликта (многие поставщики JPA будут выдавать ошибки, если обнаружат, что у вас имеется более одного доступного для записи сопоставления для поля).
При двунаправленных отношениях этот контроль менее очевиден. В двунаправленном отношении транзакции-ошибки предположим, что это двунаправленное сопоставление OneToOne, а для Transaction1 задано значение Error1 и наоборот. Допустим, ваше приложение определяет, что Transaction1 должен быть указан вместо Error2, и изменяет ссылку. Если ссылка Error1 на Transaction1 не исправлена, чтобы отразить эту ситуацию, для JPA существует проблема в определении того, какое значение ввести во внешний ключ. Это где собственность вступает в игру. Обладающая сторона считается доступным для записи отображением, и изменения в ней управляют полями внешнего ключа. В OneToMany стороной-владельцем обычно является обратная ссылка ManyToOne, поскольку она более естественна, поскольку внешний ключ в любом случае находится в таблице, содержащей ManyToOne. Если вы вносите изменения, чтобы добавить ошибку в транзакцию, но не изменяете ошибку, чтобы также ссылаться на эту транзакцию, ваша объектная модель будет не синхронизирована с тем, что входит в базу данных - внешний ключ в ошибке не будет изменен, но объект транзакции будет отображать ошибку в своем списке, пока он не будет обновлен или перезагружен из базы данных.
Каскадирование - это нечто, не связанное с владением. Это просто означает, что операция (сохранить, объединить, удалить, обновить) применяется к объекту, на который ссылается отношение. При использовании cascade.all вызова em.refresh (транзакция) транзакция и все указанные ошибки будут обновлены из базы данных. Любые отношения ошибок, имеющие каскадную настройку ALL или REFRESH, также будут обновлены и так далее. JPA должен обнаружить, что он уже обновил ссылочный экземпляр Transaction, если вы поместите его в обратные ссылки, но зачем рисковать. Как правило, каскадные параметры следует размещать только в отображениях, где они необходимы, чтобы избежать непреднамеренных последствий. Если вы не уверены, нужно ли это, оставьте это, пока не будете уверены. Такие вещи, как ленивая выборка и другая оптимизация, могут вызвать всевозможные странные и трудные для поиска ошибки, когда кто-то идет и ставит каскадное обновление везде.
В вашем примере вы можете поместить каскадное слияние в корневую сущность, которую ваше приложение будет передавать. Любые изменения, внесенные в этот график, легко воспринимаются одним вызовом слияния без необходимости слияния на каждом отдельном листе. Однако то, как ваша модель будет построена и сериализована, повлияет на слияние, поэтому обычно каскадные параметры помещаются только в отношения root-> Leaf, чтобы избежать проблем, где root -> leaf -> root 'где root! = Root'. Если у вас есть каскадное слияние с обеих сторон, состояние root 'может перезаписать ваши изменения в root.