Неленивые коллекции в Hibernate
Система:
Имеется хранилище объектов которые загружаеются с помощью hibernate и в дальнейшем обрабатываются на других JVM. При отсылке получателям объекты клонируются, модифицируются, сериализуются и уходят клиентам.
Проблема:
При загрузке коллекций hibernate подставляет вместо java коллекций свои, а именно PersistentSet etc. В этих коллекциях хранится оригинальный набор данных для персистенса и ссылка на entity хозяина. Когда мы делаем shallow clone(), то новый объект получает неявный референс на объект загруженый hibernate.
Существующее решение:
В данный момент в качестве хотфикса в пост загрузочном колбэке заменяются персистент сеты на hashset путем копирования данных. Но это решение неудовлетворительное т.к. эти методы пишут клиенты, которые могут и забыть это сделать. Доступа к их исходникам считаем что у нас нет.
В данный момент видятся такие решения:
LoadInterceptor не работает т.к. коллекции могут быть в нем ещё не загружены.
Достать коллекции через reflection используя мета-ниформацию из мэппинга. Видится как крайний вариант т.к. мэппинг может быть объявлен через доступ к полям.
PostLoadEvent требует тот же рефлекшн т.к. мы имеем только объект entity после его загрузки.
Вопрос:
Какие ещё возможны пути решения проблемы?
Какая-то кастомизация персистера коллекций в hibernate?
Имеется хранилище объектов которые загружаеются с помощью hibernate и в дальнейшем обрабатываются на других JVM. При отсылке получателям объекты клонируются, модифицируются, сериализуются и уходят клиентам.
Проблема:
При загрузке коллекций hibernate подставляет вместо java коллекций свои, а именно PersistentSet etc. В этих коллекциях хранится оригинальный набор данных для персистенса и ссылка на entity хозяина. Когда мы делаем shallow clone(), то новый объект получает неявный референс на объект загруженый hibernate.
Существующее решение:
В данный момент в качестве хотфикса в пост загрузочном колбэке заменяются персистент сеты на hashset путем копирования данных. Но это решение неудовлетворительное т.к. эти методы пишут клиенты, которые могут и забыть это сделать. Доступа к их исходникам считаем что у нас нет.
В данный момент видятся такие решения:
LoadInterceptor не работает т.к. коллекции могут быть в нем ещё не загружены.
Достать коллекции через reflection используя мета-ниформацию из мэппинга. Видится как крайний вариант т.к. мэппинг может быть объявлен через доступ к полям.
PostLoadEvent требует тот же рефлекшн т.к. мы имеем только объект entity после его загрузки.
Вопрос:
Какие ещё возможны пути решения проблемы?
Какая-то кастомизация персистера коллекций в hibernate?
