[英]Spring JPA - Data integrity relationships
我是Java的新手,还是Spring的新手(Boot和JPA),但我很好奇,我正在尝试调试一个问题,即“未为实体指定标识符”。
出于说明目的,我从该图中创建了以下表格:
最初,用户表和车辆表之间存在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;
}
}
我认为,在您的情况下,中间表不必具有Entity类。 如果配置正确,该表将自动生成。 在此表中,将没有列ID
,只有两列包含userID
ID
和vehicleID
数据。
现在,如果您的中间表具有超出建立M:N关系所需的内容,那么就需要中间Entity类以及它的ID
。 例如,如果此类旨在在每次建立关系时存储时间戳,则您必须:
ID
字段,并使用适当的生成策略 JPA / Hibernate的这一部分使我很困惑,我以前经常接触到它们。 如果我的记忆力对我有益,那么这就是正确/完美的工作方式。
您可以指定一个组合主键类,该主键类映射到实体的多个字段或属性。
以下是示例代码:
public class ActivityRegPK implements Serializable {
private int activityId;
private int memberId;
public int getActivityId() {
return activityId;
}
public void setActivityId(int activityId) {
this.activityId = activityId;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
}
关联表/类:
@IdClass(ActivityRegPK.class)
@Entity
@Table(name="activity_reg")
@NamedQuery(name="ActivityReg.findAll", query="SELECT a FROM ActivityReg a")
public class ActivityReg implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="activity_id")
private int activityId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="ins_date")
private Date insDate;
@Id
@Column(name="member_id")
private int memberId;
}
活动类
@Entity
@NamedQuery(name="Activity.findAll", query="SELECT a FROM Activity a")
public class Activity implements Serializable {
// some attributes
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.