Spring Boot + Hibernate: не извлекает отношения отложенной загрузки при сериализации коллекций - PullRequest
0 голосов
/ 28 мая 2018

Я изучаю Spring Boot, и на самом деле я пытаюсь получить загруженные ленивые ассоциации именно тогда, когда это необходимо, и не включает Json, сгенерированный во время рендеринга страницы.

У меня есть класс Person, у которого естьавтоассоциация "папа":

@Entity(name = "Person")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long idPerson;

    private String Name;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "idFather")
    private Person father;

    /*Getters and setters ommited*/
}

Я настроил объект сопоставления с Джексоном, как это предлагается на этом сайте :

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    return new Jackson2ObjectMapperBuilder()
            .modulesToInstall(Hibernate5Module.class);
}

Наконец, у меня есть GETконечная точка, которая будет возвращать одного человека, если идентификатор сообщен или перечислить всех в противном случае.Мой PersonRepository simple расширяет интерфейс CrudRepository.

Когда я пытаюсь получить одну запись, отец загружается не так, как ожидалось:

//localhost:9000/person/2
{"idPerson":2,"name":"Luke Skywalker","father":null}

Но если я пытаюсь получить всех людей (CrudRepository.listAll) ассоциации извлекаются:

//localhost:9000/person
[  
   {  
      "idPerson":1,
      "name":"Darth Vader",
      "father":null
   },
   {  
      "idPerson":2,
      "name":"Luke Skywalker",
      "father":{  
         "idPerson":1,
         "name":"Darth Vader",
         "father":null
      }
   }
]

Я не желаю этого поведения, и мне, вероятно, не хватает некоторой конфигурации в Object Mapper.

Кто-нибудь имеет представление о том, что мне следует делать?

Редактировать:

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

Первый: ответ при наличии старого и WebMvcConfigurerAdapter устарел в Hibernate 5.

Второй: на основе Настройте Джексона, чтобы он не использовал атрибуты отложенной загрузки в Spring Boot .Я подозреваю, что решение, предоставленное @ r1ckr по первой теме, фактически эквивалентно тому, что я использую:

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    return new Jackson2ObjectMapperBuilder()
            .modulesToInstall(Hibernate5Module.class);
}

Третье: даже зная об устаревании, я попробовал предложенное решение с тем же поведением, которое усиливало вторуюточка.

Четвертый: я попробовал тот же подход, используя реальный интерфейс WebMvcConfigurer, и снова добился того же поведения.

@Configuration
@EnableWebMvc
public class Configuration implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonMessageConverter());
        WebMvcConfigurer.super.configureMessageConverters(converters);
    }

    public MappingJackson2HttpMessageConverter jacksonMessageConverter() {
        MappingJackson2HttpMessageConverter messageConverter = 
            new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Hibernate5Module());
        messageConverter.setObjectMapper(mapper);
        return messageConverter;
    }
}

1 Ответ

0 голосов
/ 29 мая 2018

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

Когда я включил журнал SQL, я мог видеть структурувыдавал единственную избранную оценку.Это имеет смысл: если у меня есть все данные в памяти, почему бы не заполнить ассоциации на ранней стадии и избежать проблем с извлечением данных в будущем?Очень умно, действительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...