Проблема заключалась в том, что у меня уже были все объекты в отсоединенном состоянии, и выполнение поиска привело к загрузке всего дерева объектов еще раз.
Использование em.getReference
не решило проблему, так как доступлюбой из атрибутов объекта вызвал его загрузку, поэтому у него возникла та же проблема, что и при поиске.
решение состоит в том, чтобы использовать только отсоединенные экземплярыновая функция слияния выглядит примерно так:
void merge(Raum r, Fakultaet f, Standort s) {
r.setFakultaet(f);
r.setStandort(s);
f.getRaums().add(r);
s.getRaums().add(r);
em.merge(r);
}
, где все параметры являются отдельными экземплярами.
Это все еще имеет проблему (по крайней мере, для меня и моей спящей версии 3.2): послеобъединить отсоединенный объект (raum) не имеет обновленного поля версии, поэтому выполнение нового обновления вызовет исключение, и мне пришлось исправить это, увеличив поле версии в моем методе
void merge(Raum r, Fakultaet f, Standort s) {
try {
r.setFakultaet(f);
r.setStandort(s);
f.getRaums().add(r);
s.getRaums().add(r);
em.merge(r);
r.setVersion(r.getVersion() + 1);
}
catch(RuntimeException re) {
// logging
throw re;
}
}
Thisэто скорее хак, но ... это работает, и я не смог найти лучшего решения, учитывая, что этот код предназначен для веб-сайта, где работа с отдельными экземплярами является лучшим решением (создание дерева объектов занимает много времени, и яне хочу воссоздавать все с каждым запросом)