From f32c9f2ea34742dc499c04495c56ef39d65b4af4 Mon Sep 17 00:00:00 2001 From: Majd Date: Thu, 31 Jan 2019 15:12:35 +0200 Subject: [PATCH] Addding ManyToOne relation --- README.md | 7 ++-- .../majd/project/MajdProjectApplication.java | 1 - .../classes/driver/DriverRepository.java | 4 +- .../project/classes/driver/DriverService.java | 12 ++---- .../project/classes/passenger/Passenger.java | 17 ++++++++ .../passenger/PassengerController.java | 13 ++++++ .../passenger/PassengerRepository.java | 2 +- .../classes/passenger/PassengerService.java | 42 ++++++++++++++++++- .../project/superclasses/vehicle/Vehicle.java | 18 ++++++++ 9 files changed, 98 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 0d8be11..eee33a4 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,9 @@ A training project for MagnaMedia ## Solution -1. Adding `@JsonManagedReference` and `@JsonBackReference` around the relational entities -2. Adding Exceptions -3. Custom queries to fetch super classes +1. Adding `@ManyToOne` relation +2. Adding more exceptions +3. Adding repoistories for superclasses to fetch their entities ## Problems 1. No transactional -2. OneToOne relation only diff --git a/src/main/java/majd/project/MajdProjectApplication.java b/src/main/java/majd/project/MajdProjectApplication.java index 3c5edc8..ea6f3bb 100644 --- a/src/main/java/majd/project/MajdProjectApplication.java +++ b/src/main/java/majd/project/MajdProjectApplication.java @@ -8,7 +8,6 @@ public class MajdProjectApplication { public static void main(String[] args) { SpringApplication.run(MajdProjectApplication.class, args); - } } diff --git a/src/main/java/majd/project/classes/driver/DriverRepository.java b/src/main/java/majd/project/classes/driver/DriverRepository.java index c6811ee..8b0aaa5 100644 --- a/src/main/java/majd/project/classes/driver/DriverRepository.java +++ b/src/main/java/majd/project/classes/driver/DriverRepository.java @@ -1,8 +1,10 @@ package majd.project.classes.driver; +import java.util.Optional; + import org.springframework.data.repository.CrudRepository; public interface DriverRepository extends CrudRepository{ - + public Optional findByVehicleId(Integer vehicleId); } diff --git a/src/main/java/majd/project/classes/driver/DriverService.java b/src/main/java/majd/project/classes/driver/DriverService.java index 8f7a7e6..f0ababd 100644 --- a/src/main/java/majd/project/classes/driver/DriverService.java +++ b/src/main/java/majd/project/classes/driver/DriverService.java @@ -3,8 +3,6 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import javax.persistence.Query; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -50,12 +48,10 @@ public void deleteDriver(Integer id) { } public Driver getDriverByVehicleId(Integer vehicleId) { - Query query = entityManager.createQuery("SELECT b FROM Driver b WHERE vehicle_id = ?1", Driver.class); - - query.setParameter(1, vehicleId); Driver driver = null; try { - driver = (Driver) query.getResultList().get(0); + driver = driverRepository.findByVehicleId(vehicleId).get(); + } catch (Exception e) { throw new RuntimeException("No driver assigned to vehicle " + vehicleId, e); } @@ -64,12 +60,10 @@ public Driver getDriverByVehicleId(Integer vehicleId) { public void assignVehicleToDriver(Integer driverId, Integer vehicleId) { Driver driver = null; Vehicle vehicle = null; - Query query = entityManager.createQuery("SELECT b FROM Vehicle b WHERE id = ?1", Vehicle.class); - query.setParameter(1, vehicleId); try { driver = driverRepository.findById(driverId).get(); - vehicle = (Vehicle) query.getResultList().get(0); + vehicle = vehicleRepository.findById(vehicleId).get(); } catch (Exception e) { throw new RuntimeException("Error finding Driver " + driverId + " or Vehicle " + vehicleId, e); diff --git a/src/main/java/majd/project/classes/passenger/Passenger.java b/src/main/java/majd/project/classes/passenger/Passenger.java index 95b7604..77d7419 100644 --- a/src/main/java/majd/project/classes/passenger/Passenger.java +++ b/src/main/java/majd/project/classes/passenger/Passenger.java @@ -1,16 +1,25 @@ package majd.project.classes.passenger; +import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import com.fasterxml.jackson.annotation.JsonBackReference; import majd.project.superclasses.person.Person; +import majd.project.superclasses.vehicle.Vehicle; @Entity public class Passenger extends Person { + @Column(nullable=false) private String destination; private int payment; + @ManyToOne + @JsonBackReference + private Vehicle vehicle; + public Passenger() { } @@ -32,6 +41,14 @@ public int getPayment() { public void setPayment(int payment) { this.payment = payment; } + + public Vehicle getVehicle() { + return vehicle; + } + + public void setVehicle(Vehicle vehicle) { + this.vehicle = vehicle; + } diff --git a/src/main/java/majd/project/classes/passenger/PassengerController.java b/src/main/java/majd/project/classes/passenger/PassengerController.java index 7e09822..e044a0f 100644 --- a/src/main/java/majd/project/classes/passenger/PassengerController.java +++ b/src/main/java/majd/project/classes/passenger/PassengerController.java @@ -1,5 +1,7 @@ package majd.project.classes.passenger; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -31,4 +33,15 @@ public void addPassenger(@RequestBody Passenger passenger) { public void deletePassenger(@PathVariable Integer id) { passengerService.deletePassenger(id); } + + @RequestMapping(method=RequestMethod.POST, value="/assign/passengers/to/vehicle/{vehicleId}") + public void assignPassengersToVehicle(@RequestBody List passengers,@PathVariable Integer vehicleId) { + + passengerService.assignPassengersToVehicle(passengers, vehicleId); + + } + @RequestMapping("/find/passengers/of/vehicle/{vehicleId}") + public Iterable findPassengersOfVehicleId(@PathVariable Integer vehicleId) { + return passengerService.findPassengersOfVehicleId(vehicleId); + } } diff --git a/src/main/java/majd/project/classes/passenger/PassengerRepository.java b/src/main/java/majd/project/classes/passenger/PassengerRepository.java index bd9cbcb..8cda2a8 100644 --- a/src/main/java/majd/project/classes/passenger/PassengerRepository.java +++ b/src/main/java/majd/project/classes/passenger/PassengerRepository.java @@ -3,5 +3,5 @@ import org.springframework.data.repository.CrudRepository; public interface PassengerRepository extends CrudRepository{ - + public Iterable findByVehicleId(Integer vehicleId); } diff --git a/src/main/java/majd/project/classes/passenger/PassengerService.java b/src/main/java/majd/project/classes/passenger/PassengerService.java index b8287dc..331476d 100644 --- a/src/main/java/majd/project/classes/passenger/PassengerService.java +++ b/src/main/java/majd/project/classes/passenger/PassengerService.java @@ -1,16 +1,24 @@ package majd.project.classes.passenger; + +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import majd.project.classes.passenger.Passenger; +import majd.project.superclasses.vehicle.Vehicle; +import majd.project.superclasses.vehicle.VehicleRepository; @Service public class PassengerService { + @Autowired private PassengerRepository passengerRepository; + @Autowired + private VehicleRepository vehicleRepository; + public Iterable getAllPassengers() { return passengerRepository.findAll(); } @@ -34,5 +42,35 @@ public void deletePassenger(Integer id) { throw new RuntimeException("Passenger " + id + " does not exist", e); } - } + } + + public void assignPassengersToVehicle(List passengers, Integer vehicleId) { + + Vehicle vehicle = null; + try { + vehicle = vehicleRepository.findById(vehicleId).get(); + } catch (Exception e) { + throw new RuntimeException("Vehicle with id " + vehicleId + " does not exist!", e); + } + + + for(Passenger passenger : passengers) { + passenger.setVehicle(vehicle); + try { + passengerRepository.save(passenger); + } catch (Exception e) { + + throw new RuntimeException("Error saving some passenger", e); + } + + + vehicle.getPassengers().add(passenger); + + } + vehicleRepository.save(vehicle); + } + + public Iterable findPassengersOfVehicleId(Integer vehicleId) { + return passengerRepository.findByVehicleId(vehicleId); + } } diff --git a/src/main/java/majd/project/superclasses/vehicle/Vehicle.java b/src/main/java/majd/project/superclasses/vehicle/Vehicle.java index 8963717..6b44a87 100644 --- a/src/main/java/majd/project/superclasses/vehicle/Vehicle.java +++ b/src/main/java/majd/project/superclasses/vehicle/Vehicle.java @@ -1,17 +1,21 @@ package majd.project.superclasses.vehicle; +import java.util.List; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import com.fasterxml.jackson.annotation.JsonManagedReference; import majd.project.classes.driver.Driver; +import majd.project.classes.passenger.Passenger; @Entity @@ -28,6 +32,10 @@ public abstract class Vehicle { @JsonManagedReference private Driver driver; + @OneToMany + @JsonManagedReference + private List passengers; + public Vehicle() { } @@ -62,5 +70,15 @@ public Driver getDriver() { public void setDriver(Driver driver) { this.driver = driver; } + + public List getPassengers() { + return passengers; + } + + public void setPassengers(List passengers) { + this.passengers = passengers; + } + + }