@OneToOne(cascade = {CascadeType.ALL}) problem



我的代码有问题。我做了一个小的CarRent网络服务,当我试图将Erland分配给汽车时,我想分配的差事是添加到差事列表中。。。

这是差事的控制器

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 +
'}';
}
}

这是CarService 的一部分

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

我不知道什么是问题。。。你能帮我吗?

编辑,我添加了汽车和跑腿类

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

和差事类

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. 对REST uri使用复数名词,如:
@GetMapping("cars")
@GetMapping("errands")

等等。而不是动词,比如:assignArranged

  1. 如果您拆分存储库和服务,请不要将登录名放在存储库中,如
@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);
}

最新更新