首页 > 解决方案 > 未知实体:java.lang.String

问题描述

我的小 WebApp 有问题。

添加 SQL 连接后,我无法删除/添加/编辑我的汽车。这里有什么问题?我是入门级,所以请直接解释我的问题是什么。

  package com.RentCar.Rent_A_car.domain;

    import javax.persistence.*;

@Entity
public class Car {


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

    @OneToOne
    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;
    }

    /*
        To jest sposób na wstryzkiwanie przez metodę


         */
    //    public Car(String mark, String plate, int mileage) {
//        this.mark = mark;
//        this.plate = plate;
//        this.mileage = mileage;
//    }
//
    @Override
    public String toString() {
        // dodać czy jest uszkodzone, stoi na parkingu, jest u mechanika
        if(errand == null){
            return "Car " + mark + ". Plate number: " + plate + ". Milage: " + mileage +
                    ". Errand of car : Car have no errand";
        } else {
            return "Car " + mark + ". Plate number: " + plate + ". Milage: " + mileage +
                    ". Current errand: " + errand;
        }
    }
}

这是我的 CarRepo 课程

    enter code here
    package com.RentCar.Rent_A_car.domain.Repository;

import com.RentCar.Rent_A_car.domain.Car;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@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
    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){
        em.remove(plate);

    }


    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";
    }



}

这是我的控制器类

   package com.RentCar.Rent_A_car.domain.Controllers;

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

import javax.transaction.Transactional;
import javax.websocket.server.PathParam;
import java.util.ArrayList;
import java.util.List;

@Controller
    public class CarController {

// nie powinno się komunikować między bazą danych a kontrolerem, pomiędzy powinien być serwis.
@Autowired
CarService carService;


@RequestMapping("/cars")
public String getCars(Model model) {
    List<Car> CarList = carService.getAllCars();
    model.addAttribute("cars", CarList);
    return "cars";
}

@RequestMapping("/newcar")
public String newCar(Model model) {
    model.addAttribute("car", new Car());
    return "newcar";
}

// W TYM WYPADKU KOMUNIKACJA IDZIE OD KLIENTA, W atrybucie podajemy co otrzymujemy ( nmowe auto)
@RequestMapping(value = "/cars", method = RequestMethod.POST)
public String saveCar(Car car) {
    carService.saveCar(car);
    return "redirect:/cars";
}

//pobieranie parametru z adresu URL
@RequestMapping("/car")
public String getCar(@RequestParam("plate") String plate, Model model) {
    Car car = carService.getCar(plate);
    model.addAttribute("car", car);
    return "car";
}

@RequestMapping(value = "/car/delete/{plate}")
@Transactional
public String deleteCar(@PathVariable("plate") String plate, Model model) {
    carService.deleteCar(plate);
    return "redirect:/cars";
}
}

拜托,我找不到问题所在。例如,如果要删除,有什么问题?也许问题出在模板中?

标签: javaspringhibernate

解决方案


问题出在这里:

public void DellateCar(String plate){
    em.remove(plate);
}

您必须传递托管 Car 对象或对它的引用,而不是一些晦涩的字符串。

public void DellateCar(String plate){
    Car c = em.getReference(Car.class, plate); // or em.find(Car.class, plate);
    em.remove(c);
}

当您仅计划删除对象时可以使用getReference(entityclass, id),因此您实际上不会遇到从数据库加载它的麻烦。否则使用find(entityclass, id)


推荐阅读