Стандартный метод JPA для инициализации ленивого объекта

Я использую JPA (Hibernate как поставщик JPA). Я действительно стараюсь избегать особенностей спящего режима и использовать спецификации JPA. У меня есть функция, которая инициализирует ленивые объекты. К сожалению, он использует специальные функции Hibernate. Это моя функция:

private T initializeAndUnproxy(T entity) {
        if (entity == null) {
            throw new 
               NullPointerException("Entity passed for initialization is null");
        }

        Hibernate.initialize(entity);
        if (entity instanceof HibernateProxy) {
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation();
        }
        return entity;
    }

Есть ли какой-либо чистый способ JPA для инициализации объектов?

Ответ 1

Кажется, что нет стандартного способа инициализации объектов.

Существует стандартный способ проверить, инициализируются ли сущности (полностью загружены) или нет, а через PersistenceUnitUtil (также см. Как проверить, инициализирована ли ленивая загруженная коллекция JPA?)

Пока объект все еще подключен, вы можете получить доступ к его свойствам для принудительной инициализации. Это не очень аккуратно, но работает в некоторой степени. Недостатком является то, что в зависимости от точной природы свойств (например, коллекции со многими элементами) вы можете запускать десятки, сотни или даже тысячи запросов в свою базу данных.

Во многих случаях вам будет лучше указать заранее, что нужно инициализировать, а не принудительно инициализировать (неизвестные) объекты программным путем. Я написал статью об этом здесь.

Но если вам действительно нужно полностью инициализировать объекты с помощью одного вызова какого-либо стандартного метода структуры, то, к сожалению, похоже, что это не так, и вам нужно будет придерживаться определенного кода Hibernate.