簡體   English   中英

當我使用 hibernate 保存實體時,外鍵不會始終保存為 null

[英]When I save an Entity with hibernate the foreign key is not saved always an null

我有兩個類User.javaVehicle.javaOneToMany關系。 當我通過 postman 發布有 2 輛車的用戶時,數據正確存儲在數據庫中,但 Vehicles 表中的外鍵始終存儲為null

User.java

@Entity
@Table(name = "users", schema = "vehicleproject")
public class User {

    @Id
    @Column(name = "user_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "email")
    private String email;

    @Column(name = "password")
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "address")
    private String address;

    @Column(name = "afm")
    private int afm;

    @Column(name = "role_id")
    private UserType type;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Vehicle> vehicles = new ArrayList<>();

    public User(){}

    public User(long id, String email, String password, String firstName, String lastName, String address, int afm, UserType type, List<Vehicle> vehicles) {
        this.id = id;
        this.email = email;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.afm = afm;
        this.type = type;
        this.vehicles = vehicles;
    }

    public User(long id, String email, String password, String firstName, String lastName, String address, int afm, UserType type) {
        this.id = id;
        this.email = email;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.afm = afm;
        this.type = type;
        this.vehicles = new ArrayList<>();
    }

    public User(String email, String password, String firstName, String lastName, String address, int afm, UserType type, List<Vehicle> vehicles) {

        this.email = email;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.afm = afm;
        this.type = type;
        this.vehicles = vehicles;
    }


    public List<Vehicle> getVehicles() {
        return vehicles;
    }

    public void setVehicles(List<Vehicle> vehicles) {

        this.vehicles = vehicles;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getAfm() {
        return afm;
    }

    public void setAfm(int afm) {
        this.afm = afm;
    }

    public UserType getType() {
        return type;
    }

    public void setType(UserType type) {
        this.type = type;
    }

    public void addVehicleToList(Vehicle vehicle){
        this.vehicles.add(vehicle);
    }

    public void removeVehicleFromUserList(Vehicle vehicle){
        this.vehicles.remove(vehicle);
    }
        
}

Vehicle.java

@Entity
@Table(name = "vehicles", schema = "vehicleproject")
public class Vehicle {

@Id
@Column(name = "vehicle_id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "brand")
private String brand;

@Column(name = "model")
private String model;

@Column(name = "creation_date")
private LocalDate creationDate;

@Column(name = "color")
private String color;

@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_id",  referencedColumnName = "user_id")
private User user;

@Column(name = "plate_number")
private String plateNumber;

public Vehicle(){
}


public Vehicle(long id, String brand, String model, LocalDate creationDate, String color, User user, String plateNumber) {
    this.id = id;
    this.brand = brand;
    this.model = model;
    this.creationDate = creationDate;
    this.color = color;
    this.user = user;
    this.plateNumber = plateNumber;
}

public Vehicle(String brand, String model, LocalDate creationDate, String color, User user, String plateNumber) {
    this.brand = brand;
    this.model = model;
    this.creationDate = creationDate;
    this.color = color;
    this.user = user;
    this.plateNumber = plateNumber;
}

public Vehicle(long id, String brand, String model, LocalDate creationDate, String color, String plateNumber) {
    this.id = id;
    this.brand = brand;
    this.model = model;
    this.creationDate = creationDate;
    this.color = color;
    this.plateNumber = plateNumber;
}

public String getPlateNumber() {
    return plateNumber;
}

public void setPlateNumber(String plateNumber) {
    this.plateNumber = plateNumber;
}


public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getBrand() {
    return brand;
}

public void setBrand(String brand) {
    this.brand = brand;
}

public String getModel() {
    return model;
}

public void setModel(String model) {
    this.model = model;
}

public LocalDate getCreationDate() {
    return creationDate;
}

public void setCreationDate(LocalDate creationDate) {
    this.creationDate = creationDate;
}

public String getColor() {
    return color;
}

public void setColor(String color) {
    this.color = color;
}


@JsonIgnore
public User getUser() {
    return user;
}

@JsonProperty
public void setUser(User user) {
    this.user = user;
}


@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Vehicle vehicle = (Vehicle) o;
    return id == vehicle.id;
}

@Override
public int hashCode() {
    return Objects.hash(id);
}

}

我的json有效載荷是:

{
    "email": "new@player7.com",
    "password": "newplayer2",
    "firstName": "ithList",
    "lastName": "Constructor",
    "address": "Ermou 20",
    "afm": 1005733537,
    "type": "USER",
    "vehicles": [
    {
        "brand": "MASSERATI",
        "model": "GOD",
        "creationDate": "2015-05-05",
        "color": "WHITE",
        "plateNumber": "Amm2421"
    },
    {
        "brand": "Toyota",
        "model": "Corolla",
        "creationDate": "2015-05-05",
        "color": "WHITE",
        "plateNumber": "Fmmf2421"
    }
    ]
}
  • 我在我的 spring 啟動應用程序中看到了這一點,它為用戶插入所有數據,為新用戶生成一個 Id。
  • 它還插入為車輛生成新 ID 的車輛的所有數據,但在車輛的 FK 列中,它始終插入null
2020-07-12 15:55:20.169 TRACE 14700 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [6] as [BIGINT] - [null]

RestController 插入用戶的方法:

   @PostMapping
   @ResponseStatus(HttpStatus.CREATED)
   public User insert(@RequestBody User user) {
    return userService.save(user);
   }

@KavithakaranKanapathippillai 您提出的解決方案有效!

“在返回 userService.save(user); 之前添加這個 user.getVehicles().forEach(vehicle -> vehicle.setUser(user));”

但我無法理解,因為它是 Json 用戶 Object 內部的車輛,為什么它不能直接工作?

嘗試從方法 getUser 和 setUser 以及字段用戶用戶中刪除 @Json,並將用戶 ID 添加到您的 json 中:

"user": {"id" = 1}
       

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM