удалить Hibernate из сущности pojo? - PullRequest
4 голосов
/ 16 декабря 2011

Я экспериментировал с удалением специфических деталей Hibernate из сущностей pojo (например, когда мне нужно их сериализовать и отправлять на удаленные машины), и ниже приведен код, который я придумал. Его 'initializeAndUnproxy ()' взят из одного из ответов, которые дал Божо: Преобразование прокси Hibernate в реальный объект , и я изменил его для вызова в нем рекурсивного метода.

Мне бы хотелось, чтобы ваши комментарии к этому коду касались его недостатков. Например. он не удалит из него типы «PersistentSet». Итак, какие улучшения вы бы предложили?

static <T> T initializeAndUnproxy(T entity) throws IllegalArgumentException, IllegalAccessException
{
    if(entity == null)
    {         
        throw new NullPointerException("Entity passed for initialization is null");     
    } 

    Hibernate.initialize(entity);       
    T ret = entity;

    if(entity instanceof HibernateProxy)
    {           
        ret = (T)((HibernateProxy)entity).getHibernateLazyInitializer().getImplementation();
        initializeRecursively(ret);         
    }

    return ret;
}

static void initializeRecursively(Object entity) throws IllegalArgumentException, IllegalAccessException
{
    Class<?> clazz = entity.getClass();
    Field[] fields = clazz.getDeclaredFields();

    for(Field field : fields)
    {
        field.setAccessible(true);          
        Object obj = field.get(entity);                     
        Hibernate.initialize(obj);

        if(obj instanceof HibernateProxy)
        {                               
            obj = ((HibernateProxy)obj).getHibernateLazyInitializer().getImplementation();
            field.set(entity, obj);     
            initializeRecursively(obj);
        }           
        if(obj instanceof LazyInitializer)
        {                       
            obj = ((LazyInitializer)obj).getImplementation();   
            initializeRecursively(obj);
        }                       
    }
}

Ответы [ 2 ]

1 голос
/ 08 января 2012

Объект клонирования может быть?Клонируйте каждый объект, который вы хотите сериализовать и отправить по сети.Вы должны написать метод клонирования, хотя у вас не будет дополнительного класса DTO для каждого POJO

0 голосов
/ 16 декабря 2011

Я не вижу смысла. Если я правильно понимаю

  • удаленному клиенту все еще нужно иметь Jibernate-файлы в своем пути к классам,
  • все, что нужно сделать, это рекурсивно инициализировать все связи toOne сущности

Итак, вы, вероятно, все еще будете иметь ленивые исключения загрузки из-за неинициализированных прокси в коллекциях. Вы, вероятно, перенесете больше данных, чем необходимо, на удаленный клиент, который, вероятно, не нуждается во всех ассоциациях toOne и во всех инициализированных коллекциях. Это, конечно, сгенерирует множество дополнительных запросов к базе данных.

Моя точка зрения такова, что

  • либо клиент тесно связан с сервером, может зависеть от Hibernate и использует отдельные объекты Hibernate. И вам следует только инициализировать то, что нужно инициализировать клиенту
  • или клиент ios слабо связан и может не зависеть от Hibernate, и вам следует затем перенести общие DTO и преобразовать свои сущности в DTO.
...