gpt4 book ai didi

java - Spring JPA - 数据完整性关系

转载 作者:行者123 更新时间:2023-12-01 09:17:46 25 4
gpt4 key购买 nike

我是 Java 新手,对 Spring(Boot 和 JPA)更陌生,但我很好奇,我正在尝试调试一个问题,该问题显示“没有为实体指定标识符”。

出于说明目的,我根据该图表创建了下表:

enter image description here

最初,用户和车辆表之间存在 M:N 关系,因此我创建了一个关联实体 (UserVehicleAsso) 来将两者分开。我正在遵循有关 Java 中 M:N 映射的指南,http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/

在大多数情况下,它非常简单,但我的问题是,在关联实体 (UserVehicleAsso) 中,我是否必须对每个外键使用 @Id 注释?我认为我不需要,因为这些是从每个相应的表自动生成的。

请告诉我您的想法或评论,谢谢。

另外,下面是我用来生成这些模型的代码:

对于用户表/类:

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int userId;

private String fName;
private String lName;

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="userVehicleAsso",
joinColumns={@JoinColumn(name="userID")},
inverseJoinColumns={@JoinColumn(name="vehicleID")})
private Set<Vehicle> vehicles = new HashSet<Vehicle>();


//constructor
protected User() {}


public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getFName() {
return fName;
}
public void setFName(String fName) {
this.fName = fName;
}
public String getLName() {
return lName;
}
public void setLName(String lName) {
this.lName = lName;
}



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

public void setVehicles(Set<Vehicle> vehicles) {
this.vehicles = vehicles;
}

@Override
public String toString() {
return getFName() + "," + getLName();
}}

对于车辆表/类:

@Entity
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int vehicleId;

private String brand;
private String model;
//foreign key mappings
//mapping with associative
@ManyToMany(mappedBy="vehicles")
private Set<User> users = new HashSet<User>();


//constructors
protected Vehicle() {}

public Vehicle(int id) {
this.vehicleId = id;
}

public Vehicle (String brand, String model) {
this.brand = brand;
this.model = model;
}

/* public Vehicle() {

}*/


public int getVehicleId() {
return vehicleId;
}
public Set<User> getUsers() {
return users;
}

public void setUsers(Set<User> users) {
this.users = users;
}


public void setVehicleId(int vehicleId) {
this.vehicleId = vehicleId;
}
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;
}
@Override
public String toString() {
// + setBodyType() + "," +
return getBrand() + "," + getModel();
}


}

最后,我的关联表/类:

@Entity
public class UserVehicleAsso{

private int userID;
private int vehicleID;

public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public int getVehicleID() {
return vehicleID;
}
public void setVehicleID(int vehicleID) {
this.vehicleID = vehicleID;
}


}

最佳答案

在我看来,在您的情况下,中间表没有必要有一个实体类。如果配置正确,该表将自动生成。在此表中,不会有 ID 列,只有两列包含 userIDvehicleID 数据。

现在,如果您的中间表的内容超出了建立 M:N 关系所需的内容,则需要您的中间实体类及其 ID。例如,如果此类旨在每次建立关系时存储时间戳,则必须:

  1. 创建此实体类,
  2. 为其指定一个具有适当生成策略的 ID 字段,
  3. 将时间戳映射到具有适当类型、注释/XML 映射等的字段。

JPA/Hibernate 的这一部分让我很困惑,我曾经陷入其中。如果我没记错的话,这就是事情应该如何运作的正确/完美的方式。

关于java - Spring JPA - 数据完整性关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40412014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com