Как сообщить EclipseLink реализовать спецификацию JPA, как ожидалось

#java #jpa #spring-boot #eclipselink

#java #jpa #весенняя загрузка #eclipselink

Вопрос:

Я использую Spring-boot с EclipseLinkJpaVendorAdapter.

Одна из моих сущностей содержит коллекцию с нетерпеливым типом выборки:

 @Entity
public class Teacher implements Serializable {

    @OneToMany(mappedBy = "teacher", fetch = FetchType.EAGER)
    private List<Course> courses = new ArrayList<Course>();
  

Теперь, когда я хочу получить список преподавателей, список курсов всегда пуст (даже когда я пытаюсь получить список с помощью метода .size ())):

 @Override
@Transactional(readOnly = true)
public Iterable<Teacher> findAllWithCoursesInitialized() {
    final Iterable<Teacher> teachers = rep.findAll();
    teachers.forEach(teacher -> teacher.getCourses().size());

    return teachers;
}
  

Дополнительно конфигурация eclipse link:

 @Override
    protected Map<String, Object> getVendorProperties() {
        final Map<String, Object> map = new HashMap<String, Object>();
        map.put("eclipselink.weaving", "true");
        map.put("eclipselink.ddl-generation", "none");
        map.put("eclipselink.cache.shared.default", "false");
        return map;
    }
  

На мой взгляд, EAGER должно быть достаточно, но по какой-то причине его нет. Кто-нибудь может сказать мне, что я должен изменить / настроить?

Комментарии:

1. Вам не нужно «сообщать» EclipseLink о реализации спецификации JPA. Он реализует это, и все. Не обвиняйте его в ошибках в вашем программировании. Если список пуст, это не имеет никакого отношения к LAZY/EAGER . Это означает, что нет курсов, связанных с преподавателями.

2. … но обвиняйте EclipseLink, если вы можете доказать, что в его реализации есть ошибка (а их есть несколько); то, что вы здесь представляете, не является доказательством. Посмотрите на SQL, вызванный для поиска. EAGER — это подсказка только к реализации

3. Я забыл упомянуть, что с Hibernate все работает нормально

4. Было бы весьма поразительно, если бы у них была «ошибка», которая, очевидно, нарушила бы такую важную функцию.

5. Ваш OneToMany отображается с помощью teacher revers mapping. Когда вы создаете ссылки на преподавателей и курсы, изменяете ли вы и объединяете ли изменения с обеих сторон этой двунаправленной связи? Эта проблема обычно возникает, когда пользователи ошибочно устанавливают ТОЛЬКО отношение владения, оставляя другую сторону пустой. Если задействовано какое-либо кэширование (либо совместно используемое, либо даже в том же контексте EntityManager), эта другая сторона будет оставаться пустой до тех пор, пока она не будет обновлена или иным образом принудительно загружена из базы данных.