@OneToOne (каскад = {CascadeType.ALL}) проблема

#spring #hibernate

#весна #спящий режим

Вопрос:

У меня проблема с моим кодом. Я делаю небольшой веб-сервис CarRent, и когда я пытаюсь назначить поручение машине, поручение, которое я хочу назначить, добавляется в список поручений…

это контроллер errand

     package com.RentCar.Rent_A_car.domain.Controllers;

import com.RentCar.Rent_A_car.domain.Car;
import com.RentCar.Rent_A_car.domain.Errand;
import com.RentCar.Rent_A_car.domain.Services.CarService;
import com.RentCar.Rent_A_car.domain.Services.ErrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class ErrandController {

    @Autowired
    CarService carService;

    @Autowired
    ErrandService errandService;

    @RequestMapping("/assignErrand")
    public String assignQuest(@RequestParam("plate") String plate, Model model){
        Car car = carService.getCar(plate);
        List<Errand> errandList = errandService.getAllCurrentErrands();
        model.addAttribute("car",car);
        model.addAttribute("errands",errandList);;
        return "assignErrand";
    }

    @RequestMapping(value = "/assignErrand", method = RequestMethod.POST)
    public String assignQuest(Car car){
        carService.updateCar(car);
        System.out.println("assignquest");
        return "redirect:/cars";
    }
  

Это мои репозитории

     @Repository
    public class CarsRepository {
    
        // class to do CRUD operation on cars and errands
    
        Map<String, Car> CarList = new HashMap<>();
    
        @PersistenceContext
        private EntityManager em;
    
    
    
        @Transactional
        public void AddCar (String mark, String plate, int mileage){
            Car newCar = new Car(mark, plate, mileage);
            em.persist(newCar);
    
        }
         //pobiera aktualne id i dodaje do mapy
        @Transactional
        public void AddCar(Car car) {
            em.persist(car);
    
        }
    
        // dla każdego "powyzej" usuniętego trzeba zmniejszyć id o 1 ; pętla o dlugosci pozostałych aut id--; KONIECZNE FINALNIE, do budowy nie
        @Transactional
        public void DellateCar(String plate){
            Car c = em.find(Car.class, plate);
            em.remove(c);
        }
    
    
        public Car getCar(String plate){
    
            Car car = em.createQuery("from Car c where c.plate=:plate", Car.class)
                    .setParameter("plate", plate).getSingleResult();
            return car;
        }
    
        public Collection<Car> getAllCars() {
            return em.createQuery("from Car",Car.class).getResultList();
    
        }
        @Transactional
        public void updateCar(Car car) {
            em.merge(car);
        }
    
    //    public String getPlate() {
    //        if (CarList.isEmpty()) {
    //            return "Car list is empty";
    //        } else {
    //            return (String)CarList.keySet();
    //        }
    //    }
    
    //    @PostConstruct
    //    public void build() {
    //        AddCar("BMW","DW",100000);
    //        AddCar("Opel","DTR",100043);
    //        AddCar("Toyota","WB",1012300);
    //        AddCar("Audi","DST",102340);
    //
    //    }
    
    
        @Override
        public String toString() {
    
            return "CarsRepository{"  
                    "CarList="   
                    '}'   "n";
        }
    
    
    
       }
  

Nr

 @Repository
public class ErrandRepository {

    @PersistenceContext
    private EntityManager ee;

    List<Errand> ErrandList = new ArrayList<>();

    @Transactional
    public void createErrand(String description) {
        Errand newErrand = new Errand(description);
        ee.persist(newErrand);
        System.out.println(newErrand);

    }

    public void createErrand(Errand errand){ErrandList.add(errand);}

    public List<Errand> getAll () {
       return ee.createQuery("from Errand", Errand.class).getResultList();
    }

    public void delateErrand(Errand errand) {
        ee.remove(errand);
    }
    @Transactional
    public void delateErrand(int x) {
        ErrandList.remove(x);
    }

    public Errand getErrandId(Integer x){
        return ee.find(Errand.class, x );


    }

    @PostConstruct
    @Transactional
    public void init(){
        Errand e1 = new Errand("zlecenie na wrocław");
        Errand e2 = new Errand("zlecenie na wasdw");
        Errand e3 = new Errand("zlecenie na wfgasfdław");
    }



    @Override
    public String toString() {
        return "ErrandRepository{"  
                "ErrandList="   ErrandList  
                '}';
    }
}
  

this is a part of CarService

 public void updateCar(Car car) {
    carsRepository.updateCar(car);
    System.out.println("tu sie wywołuje updatecar");
}
  

i don’t know what is a problem… can you help me ?

edit, i add car and errand class

     package com.RentCar.Rent_A_car.domain;

import javax.persistence.*;
import javax.persistence.Entity;

@Entity
public class Car {


//    @Id
//    @GeneratedValue(strategy = GenerationType.AUTO)
//    public int id;
    String mark;
    @Id
    String plate;
    int mileage;

    @OneToOne(cascade = CascadeType.ALL)
    public Errand errand;

    public Car() { }

    public Car(String mark, String plate, int mileage) {
        this.mark = mark;
        this.plate = plate;
        this.mileage = mileage;

    }


    public void setErrand(Errand errand) {
        this.errand = errand;
    }

    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

    public String getPlate() {
        return plate;
    }

    public void setPlate(String plate) {
        this.plate = plate;
    }

    public int getMileage() {
        return mileage;
    }

    public void setMileage(int mileage) {
        this.mileage = mileage;
    }

    public Errand getErrand() {
        return errand;
    }enter code here
  

И класс errand

 package com.RentCar.Rent_A_car.domain;

import net.bytebuddy.dynamic.loading.InjectionClassLoader;

import javax.persistence.*;
import javax.persistence.Entity;
@Entity
public class Errand {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int Id;
    public String description;


    public Errand() {
    }

    public Errand(String description) {
        this.description = description;
    }

    @Override
    public String toString() {

        return description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
  

Ответ №1:

Я не совсем уверен, в чем собственно проблема. Но в любом случае, я могу дать вам несколько рекомендаций:

  1. используйте существительные множественного числа для REST uri, например:
 @GetMapping("cars")
@GetMapping("errands")
  

и так далее. Не глаголы, например: assignErrand

  1. Если вы разделяете репозитории и службы, не указывайте login в репозиториях, например
 @Transactional
    public void createErrand(String description) {
        Errand newErrand = new Errand(description);
        ee.persist(newErrand);
        System.out.println(newErrand);

    }
  

В репозиториях вы должны выполнять только работу с сохранением. Оставьте логику службе

  1. Чтобы добавить поручения, я бы выбрал что-то вроде этого:
 @PostMapping("/cars/{carId}/errands")
public Car addErranr(@PathVariable int carId, @RequestBody Errand errand){
    Car car = this.carService.findById(carId);
    car.getErrands().add(errand);
    return this.carService.save(car);
}
  

Комментарии:

1. когда я назначаю поручение car, я добавляю это поручение в таблицу поручений .. какая-то копия

2. Не могли бы вы отредактировать сообщение и добавить код для классов Car и Errand?

3. извините, приятель, но я не могу понять, где в коде вы добавляете errand в car, и какой метод контроллера вы используете для этого