Ich arbeite an einer von JHipster generierten Anwendung und muss APIs erstellen, die mithilfe von JPA-Spezifikationen und Paginierung Entitäten aus der Datenbank laden und dabei die zugehörigen Entitäten korrekt laden. Es fällt mir jedoch schwer, dafür zu sorgen, dass dies ordnungsgemäß funktioniert.
Entitätsstruktur
Ich habe drei Hauptentitäten mit den folgenden Beziehungen:
BuildingProject-Entität:
Code: Select all
@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();
}
Code: Select all
@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;
}
Code: Select all
@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;
}
Ich benötige zwei APIs:
- Laden Sie BuildingProject mit allen Einheiten und allen Fotos.
- Laden Sie alle Einheiten mit allen Fotos.
Aktuelle Implementierung
Ich habe diese Methode implementiert:
Code: Select all
@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()));
}
Code: Select all
@Repository
public interface BuildingProjectRepository extends JpaRepository, JpaSpecificationExecutor {
@EntityGraph(attributePaths = {"photos", "units"})
Page findAll(Specification spec, Pageable pageable);
}
Code: Select all
hibernate.query.fail_on_pagination_over_collection_fetch: false
Die zugehörigen Entitäten laden jeweils nur ein Element, obwohl mehr in der Datenbank vorhanden sind.
Beispieldaten aus der Fototabelle:
Code: Select all
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
Beispieldaten aus der Einheitentabelle:
Code: Select all
id, location, price, project_id
1, finally powerfully, 5169.79, 2
2, helplessly, 19973.88, 2
3, mechanically, 9074.87, 3
Aber in Protokollen erhalte ich Folgendes:
Code: Select all
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
Was ich versucht habe
- Verwendung von @EntityGraph mit attributePaths
- Einstellung von hibernate.query.fail_on_pagination_over_collection_fetch: false
- Das wurde bestätigt Alle Beziehungen werden ordnungsgemäß mit mappedBy abgebildet.
Spring Boot: 3.2.5
Java: 17
JHipster Framework: 8.4.0
Quelle: https://github.com/GGlebux/Construction.git
Die Frage
Warum werden meine zugehörigen Entitäten nicht vollständig geladen, wenn ich EntityGraph mit Spezifikation und Paginierung verwende? Wie kann ich alle zugehörigen Entitäten richtig laden und gleichzeitig die Filter- und Paginierungsfunktionen beibehalten?
Ich habe bereits viele Möglichkeiten ausprobiert.
Jede Hilfe oder Anleitung wäre sehr dankbar!
Mobile version