Я работаю над приложением, созданным 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:
- Загрузить BuildingProject со всеми объектами и всеми фотографиями.
- Загрузить все объекты Unit со всеми фотографиями.
Текущая реализация
Я реализовал этот метод:
Код: Выделить всё
@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()));
}
Код: Выделить всё
@Repository
public interface BuildingProjectRepository extends JpaRepository, JpaSpecificationExecutor {
@EntityGraph(attributePaths = {"photos", "units"})
Page findAll(Specification spec, Pageable pageable);
}
Код: Выделить всё
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
Мобильная версия