From 7d85d68bb9a9c868c0a780ab2027a9184e101ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Slov=C3=ADk?= <xslovik@fi.muni.cz> Date: Tue, 11 Apr 2023 14:17:26 +0200 Subject: [PATCH] Fixing saving of Steward to a Flight assignment through custom connection table. Adding eager fetching method. --- .../cz/muni/fi/pa165/core/data/domain/Flight.java | 3 ++- .../data/repository/flight/FlightRepository.java | 13 +++++++++---- .../flightsteward/FlightStewardRepository.java | 10 ++++++++++ .../core/facade/steward/StewardFacadeImpl.java | 8 +++----- .../fi/pa165/core/service/flight/FlightService.java | 3 +++ .../core/service/flight/FlightServiceImpl.java | 7 +++++++ .../pa165/core/service/steward/StewardService.java | 7 +++++++ .../core/service/steward/StewardServiceImpl.java | 11 ++++++++++- 8 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/data/repository/flightsteward/FlightStewardRepository.java diff --git a/core/src/main/java/cz/muni/fi/pa165/core/data/domain/Flight.java b/core/src/main/java/cz/muni/fi/pa165/core/data/domain/Flight.java index beafabb..37d1a4d 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/data/domain/Flight.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/data/domain/Flight.java @@ -9,7 +9,8 @@ import java.time.OffsetDateTime; import java.util.Collection; import java.util.Objects; -@Entity(name = "flights") +@Entity +@Table(name = "flights") @Data @NoArgsConstructor public class Flight extends DomainEntity { diff --git a/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flight/FlightRepository.java b/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flight/FlightRepository.java index ad7fc55..66d0f4d 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flight/FlightRepository.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flight/FlightRepository.java @@ -2,7 +2,8 @@ package cz.muni.fi.pa165.core.data.repository.flight; import cz.muni.fi.pa165.core.data.domain.Flight; import cz.muni.fi.pa165.core.data.repository.common.BaseRepository; -import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -10,7 +11,11 @@ import java.util.Optional; @Repository public interface FlightRepository extends BaseRepository<Flight, Long> { - @Override - @EntityGraph(attributePaths = {"flightStewards"}) - Optional<Flight> findById(Long id); + /** + * Returns Flight entity with eagerly fetched Stewards + * @param id flightId + * @return Optional<Flight> + */ + @Query("SELECT f FROM Flight f JOIN FETCH f.flightStewards fs WHERE f.id = :id") + Optional<Flight> findByIdWithStewards(@Param("id") Long id); } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flightsteward/FlightStewardRepository.java b/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flightsteward/FlightStewardRepository.java new file mode 100644 index 0000000..95a6d7b --- /dev/null +++ b/core/src/main/java/cz/muni/fi/pa165/core/data/repository/flightsteward/FlightStewardRepository.java @@ -0,0 +1,10 @@ +package cz.muni.fi.pa165.core.data.repository.flightsteward; + +import cz.muni.fi.pa165.core.data.domain.FlightSteward; +import cz.muni.fi.pa165.core.data.repository.common.BaseRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FlightStewardRepository extends BaseRepository<FlightSteward, Long> { + +} diff --git a/core/src/main/java/cz/muni/fi/pa165/core/facade/steward/StewardFacadeImpl.java b/core/src/main/java/cz/muni/fi/pa165/core/facade/steward/StewardFacadeImpl.java index b542d64..797ce7f 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/facade/steward/StewardFacadeImpl.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/facade/steward/StewardFacadeImpl.java @@ -70,12 +70,10 @@ public class StewardFacadeImpl implements StewardFacade<Long> { var flightSteward = new FlightSteward(); flightSteward.setSteward(stewardEntity); flightSteward.setFlight(flightEntity); + stewardService.saveFlightStewards(flightSteward); - flightEntity.getFlightStewards().add(flightSteward); - flightService.save(flightEntity); - - stewardEntity.getFlightStewards().add(flightSteward); - stewardService.save(stewardEntity); + // Check that Flight members were eagerly fetched + var flightEntityOptEagerlyFetched = flightService.findByIdWithStewards(flightId); //TODO create DTO without nested members return null; diff --git a/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightService.java b/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightService.java index 90fe670..e069fd3 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightService.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightService.java @@ -3,6 +3,9 @@ package cz.muni.fi.pa165.core.service.flight; import cz.muni.fi.pa165.core.data.domain.Flight; import cz.muni.fi.pa165.core.service.common.BaseService; +import java.util.Optional; + public interface FlightService extends BaseService<Flight, Long> { + Optional<Flight> findByIdWithStewards(Long id); } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightServiceImpl.java b/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightServiceImpl.java index dd4cfd3..c32b407 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightServiceImpl.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/service/flight/FlightServiceImpl.java @@ -6,6 +6,8 @@ import cz.muni.fi.pa165.core.service.common.BaseServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Optional; + @Service public class FlightServiceImpl extends BaseServiceImpl<Flight, Long> implements FlightService { @@ -16,4 +18,9 @@ public class FlightServiceImpl extends BaseServiceImpl<Flight, Long> implements super(flightRepository); this.flightRepository = flightRepository; } + + @Override + public Optional<Flight> findByIdWithStewards(Long id) { + return flightRepository.findByIdWithStewards(id); + } } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardService.java b/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardService.java index 1c83299..008cc51 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardService.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardService.java @@ -1,8 +1,15 @@ package cz.muni.fi.pa165.core.service.steward; +import cz.muni.fi.pa165.core.data.domain.FlightSteward; import cz.muni.fi.pa165.core.data.domain.Steward; import cz.muni.fi.pa165.core.service.common.BaseService; public interface StewardService extends BaseService<Steward, Long> { + /** + * Saves the assignment of Steward to a Flight + * @param flightSteward Flight<->Steward connection table + * @return FlightSteward connection table stored in DB + */ + FlightSteward saveFlightStewards(FlightSteward flightSteward); } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardServiceImpl.java b/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardServiceImpl.java index 90800d3..eefd170 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardServiceImpl.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/service/steward/StewardServiceImpl.java @@ -1,6 +1,8 @@ package cz.muni.fi.pa165.core.service.steward; +import cz.muni.fi.pa165.core.data.domain.FlightSteward; import cz.muni.fi.pa165.core.data.domain.Steward; +import cz.muni.fi.pa165.core.data.repository.flightsteward.FlightStewardRepository; import cz.muni.fi.pa165.core.data.repository.steward.StewardRepository; import cz.muni.fi.pa165.core.service.common.BaseServiceImpl; import org.springframework.beans.factory.annotation.Autowired; @@ -10,10 +12,17 @@ import org.springframework.stereotype.Service; public class StewardServiceImpl extends BaseServiceImpl<Steward, Long> implements StewardService { private final StewardRepository stewardRepository; + private final FlightStewardRepository flightStewardRepository; @Autowired - public StewardServiceImpl(StewardRepository stewardRepository) { + public StewardServiceImpl(StewardRepository stewardRepository, FlightStewardRepository flightStewardRepository) { super(stewardRepository); this.stewardRepository = stewardRepository; + this.flightStewardRepository = flightStewardRepository; + } + + @Override + public FlightSteward saveFlightStewards(FlightSteward flightSteward) { + return flightStewardRepository.save(flightSteward); } } -- GitLab