java - 未知实体: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";
}
}
拜托,我找不到问题所在。例如,如果要删除,有什么问题?也许问题出在模板中?
解决方案
问题出在这里:
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)
推荐阅读
- android - Unity3D 游戏 apk 在模拟器中完美运行,但在真实设备中无法运行?
- testng - 使用 TestNG,打开两个 URL 而不是一个
- vue.js - 通过routerlink Vuejs传递对象
- php - PHP票务系统
- express - 使用 express 和 JWT 令牌重置密码
- stripe-payments - 在条带传输中出现错误“没有这样的目的地:default_for_currency”
- c++ - C++ 中的常量字符到字节数组
- swift - 当我将 Viewcontroller 设置为根导航控制器时,我收到 found nil 错误
- python - 从 txt 文件中删除以 xyz 结尾的行
- python-2.7 - 如何捕捉 ctrl+v?