Ответ 1
Я могу дать вам свои 2 цента, извините, если мой ответ немного длинный.
Если у вас есть каскадный конфликт такого рода, возможно, это связано с тем, что ваш каскадный подход или модель домена не определены правильно. Я бы постарался обобщить каскадную стратегию на общий график или несвязанный набор элементов.
Мой совет будет заключаться в том, что каскадную стратегию следует использовать только для набора данных, тесно связанного вместе, и того же типа, что и для класса и его (частных) внутренних классов в java-мире. Связь между материнским классом и его детьми также должна быть исключительной (в UML это называется ассоциацией без разделения).
Конечно, вы можете сделать иначе (все мы можем быть ленивыми), но в конце вы можете создать сеть связи между вашим единственным потоком непрерывности (или конфигурацией сохранения) и вашим бизнес-потоком. Вам нужно будет управлять множеством исключений и выполнять большую логику конфигурации вокруг ранее созданной стратегии каскада (сохранить, обновить, удалить).
Крайним подходом было бы то, что некоторые могут захотеть сохранить только один большой корневой объект. Почему нет? остальное "должно сохраняться в каскаде". Но на самом деле это может серьезно повлиять на ремонтопригодность вашей системы. Кроме того, вам может потребоваться управлять состоянием вашего большого графика в памяти, при загрузке, сохранении и объединении.
Если вы используете веб-приложение или любое клиент-серверное приложение, ваш веб-рабочий процесс должен иметь возможность сохранять ограниченный набор объектов при каждом запросе без необходимости сохранять все из корневого элемента. Я знаю, что не отвечаю прямо на ваш вопрос. Итак, вернемся к вашему примеру:
Предположим, что P - это банк, а C1 и C2 - два Клиента, а A - Продукт.
У меня есть два простых ответа: 1) Каждый слой может быть сохранен отдельно без каскадирования. Но это может быть сделано внутри одной и той же транзакции и в том же DAO или нет, если вы хотите.
2) P и C "могут быть каскадированы. Но A должен быть сохранен в другом рабочем процессе.
Это напоминает мне о главе Питера Коада, где он рассказывает о "анализе, управляемом доменом": http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf
В этой главе объясняется, как различные объекты в графе могут быть разделены в разных архетипах. Рабочий процесс сохранения не должен совпадать между транзакционными данными и описанием, или "вещью". Это может помочь создать лучшую каскадную стратегию:
The four archetypes of Peter Coad are:
- Is it a moment or interval?
- Is it a role played?
- Is it a catalog-entry-like description?
- Otherwise, it a party, place, or thing.
Надеюсь, это поможет.