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