JPA/Hibernate EntityGraph со спецификацией и нумерацией страниц не загружает все связанные объекты правильноJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JPA/Hibernate EntityGraph со спецификацией и нумерацией страниц не загружает все связанные объекты правильно

Сообщение Anonymous »

JPA/Hibernate EntityGraph со спецификацией и разбиением на страницы не загружает все связанные объекты правильно
Я работаю над приложением, созданным JHipster, и мне нужно создать API, которые загружают объекты из базы данных с использованием спецификаций JPA и разбиения на страницы, при этом правильно загружая связанные объекты. Однако я изо всех сил пытаюсь заставить это работать правильно.
Структура объекта
У меня есть три основных объекта со следующими отношениями:
Субъект BuildingProject:

Код: Выделить всё

@Entity
@Table(name = "building_project")
public class BuildingProject implements Serializable {
@Id
@GeneratedValue(strategy = SEQUENCE)
private Long id;

@NotNull
private String name;

@NotNull
private BuildingType type;

@NotNull
private String address;

private String description;
private BigDecimal minPrice;
private Instant completionDate;

@OneToMany(fetch = LAZY, mappedBy = "project")
@JsonIgnoreProperties(value = { "photos", "bookings", "project" }, allowSetters = true)
private Set units = new HashSet();

@OneToMany(fetch = LAZY, mappedBy = "project")
@JsonIgnoreProperties(value = { "project", "unit" }, allowSetters = true)
private Set photos = new HashSet();
}
Единичная сущность:

Код: Выделить всё

@Entity
@Table(name = "unit")
public class Unit implements Serializable {
@Id
@GeneratedValue(strategy = SEQUENCE)
private Long id;

private String location;

@NotNull
private BigDecimal price;

private String description;

@NotNull
private BigDecimal area;

@NotNull
private Integer floor;

@NotNull
private UnitType type;

@NotNull
private UnitStatus status;

private Instant completionDate;

@OneToMany(fetch = LAZY, mappedBy = "unit")
@BatchSize(size = 20)
@JsonIgnoreProperties(value = { "project", "unit" }, allowSetters = true)
private Set photos = new HashSet();

@OneToMany(fetch = LAZY, mappedBy = "unit")
@JsonIgnoreProperties(value = { "client", "unit" }, allowSetters = true)
private Set bookings = new HashSet();

@ManyToOne(optional = false)
@NotNull
@JsonIgnoreProperties(value = { "units", "photos" }, allowSetters = true)
private BuildingProject project;
}
Объект фотографии:

Код: Выделить всё

@Entity
@Table(name = "photo")
public class Photo implements Serializable {
@Id
@GeneratedValue(strategy = SEQUENCE)
private Long id;

@NotNull
private String url;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "project_id")
@JsonIgnoreProperties(value = { "units", "photos" }, allowSetters = true)
private BuildingProject project;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "unit_id")
@JsonIgnoreProperties(value = { "photos", "bookings", "project" }, allowSetters = true)
private Unit unit;
}
Требования к API
Мне нужны два API:
  • Загрузить BuildingProject со всеми объектами и всеми фотографиями.
  • Загрузить все объекты Unit со всеми фотографиями.
Оба API должны поддерживать фильтрацию (с использованием спецификаций) и нумерацию страниц для повышения производительности и удобства пользователей. требования.
Текущая реализация
Я реализовал этот метод:

Код: Выделить всё

@Transactional(readOnly = true)
public void findFullByCriteria(BuildingProjectCriteria criteria, Pageable page) {
log.debug("find full by criteria : {}, page: {}", criteria, page);
final Specification specification = createSpecification(criteria);
buildingProjectRepository
.findAll(specification, page)
.forEach(b -> log.error("{} with {} photos and {} units",
b.getId(),
b.getPhotos().size(),
b.getUnits().size()));
}
Репозиторий с EntityGraph:

Код: Выделить всё

@Repository
public interface BuildingProjectRepository extends JpaRepository, JpaSpecificationExecutor {
@EntityGraph(attributePaths = {"photos", "units"})
Page findAll(Specification spec, Pageable pageable);
}
application.yml:

Код: Выделить всё

hibernate.query.fail_on_pagination_over_collection_fetch: false
Проблема
Связанные объекты загружают только один элемент каждый, хотя в базе данных их больше.
Пример данных из таблицы фотографий:

Код: Выделить всё

id, url, project_id, unit_id
1, https://straight-hepatitis.net/, 1, 1
2, https://funny-serial.net/, 1, 1
3, https://bewitched-efficiency.name/, 2, 2
4, https://partial-chili.info, 2, 2
→ Не менее двух фотографий на объект
Пример данных из таблицы единиц измерения:

Код: Выделить всё

id, location, price, project_id
1, finally powerfully, 5169.79, 2
2, helplessly, 19973.88, 2
3, mechanically, 9074.87, 3
→ Несколько модулей на проект
Но в журналах я получаю:

Код: Выделить всё

1 with 1 photos and 0 units
2 with 1 photos and 1 units
3 with 0 photos and 1 units
4 with 0 photos and 1 units
5 with 0 photos and 1 units
→ Загружается только один связанный объект вместо всех
Что я пробовал
  • Использование @EntityGraph с атрибутами
  • Настройка hibernate.query.fail_on_pagination_over_collection_fetch: false
  • Проверено что все отношения правильно отображаются с помощью mappedBy
О проекте
Spring Boot: 3.2.5
Java: 17
JHipster Framework: 8.4.0
Источник: https://github.com/GGlebux/Construction.git
The Вопрос
Почему мои связанные объекты не загружаются полностью при использовании EntityGraph со спецификацией и разбиением на страницы? Как мне правильно загрузить все связанные объекты, сохраняя при этом возможности фильтрации и разбиения на страницы?
Я уже пробовал много способов.
Буду очень благодарен за любую помощь или рекомендации!

Подробнее здесь: https://stackoverflow.com/questions/798 ... g-all-rela
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»