#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), эта другая сторона будет оставаться пустой до тех пор, пока она не будет обновлена или иным образом принудительно загружена из базы данных.