Возможно, я слишком упрощаю это, предоставив вам лишь небольшой фрагмент кода (и я опубликую больше, если это так), но я думаю, что сначала меньше, тем лучше:
Iиметь сущность типа Asset, которая имеет поле типа Location, которое также является сущностью.Когда я устанавливаю Местоположение Актива, я также должен установить Местоположение его дочерних элементов.
Location location = asset.getLocation();
em.merge(location);
em.flush();
childAsset.setLocation(asset.getLocation());
em.flush();
Когда я запускаю flush (), я получаю следующее исключение:
ВнутреннийИсключение: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: уникальное ограничение (SWRADMIN.LOCATION_PK) нарушено
Мой вопрос ... почему этот объект Location даже пытается сохраниться?Все, что я делаю, это устанавливаю переменную в сущности.
Раньше это работало нормально, но мы просто переключились на использование Eclipselink и Java EE 6, и эта проблема всплыла.
Решение?Я использовал идею «отсоединения» снизу и сделал следующее изменение:
Location location = asset.getLocation();
em.detach(childAsset);
childAsset.setLocation(asset.getLocation());
em.merge();
em.flush();
, и это сработало!Я не понимаю, почему ... хотя вы могли бы подумать, что автоматическая синхронизация будет делать то же самое.