• Как правильно сделать полную копию объекта, со всеми потомками в hibernate?

    @bobzer
    Java EE Developer
    Точного ответа не дам, но есть что сказать по этому поводу:
    1. Проблема с Proxy обычно возникает на дочерних коллекциях, особенно когда они помечены как Lazy. Hibernate подставляет в коллекцию свой прокси-объект и при обращении к коллекции осуществляет чтение из БД.
    2. Судя по всему, Hibernate.initialize(entity) в вашем случае не делает ровным счётом ничего. Этот метод следует применять не к самой сущности, а ко всем Lazy-коллекциям сущности, по отдельности к каждой. Если сущность не является detached (не "оторвана" от сессии, в которой её считывали из БД), то Hibernate.initialize и вовсе не требуется, прокси-объекты коллекций (из п.п. 1) сами считают всё из БД при обращении к списку в коде.
    3. Ваш хак - первое что пришло мне в голову еще в начале чтения вопроса (если EntryKey - это первичный ключ сущности). Как только сущность "теряет" первичный ключ, она становится кандидатом на insert, если же первичный ключ есть - тогда Hibernate сделает update. Если аккуратно "обыграть" такие манипуляции с учетом этого правила и на дочерних объектах, то почему бы и нет?
    4. Вопросы клонирования объектов - это отдельная большая и непростая тема, даже без привязки её к сущностям БД (что ещё больше эту проблему усугубляет). Два основных варианта осуществления клонирования: 1 - использовать специфические библиотеки; 2 - писать всё руками (100500 set(get())-ов). Самый надежный и производительный вариант - 2, но он порождает много лишнего кода, который еще и поддерживать надо. Тем не менее, такой подход "живее всех живых", особенно если кол-во сущностей для клонирования можно пересчитать по пальцам.
    Ответ написан
    7 комментариев