让我们考虑以下几点:
@Entity
@Table(name="person")
public class Person implements Serializable {
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Column(name="firstName")
private String firstName;
@Column(name="lastName")
private String lastName;
...getters/setters...
}
和
@Entity
@Table(name="car")
public class Car implements Serializable {
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Column(name="brand")
private String brand;
@Column(name="model")
private String model;
@Column(name="personId")
private String personId;
...getters/setters...
}
让我们想象一下,用户将订阅并输入他的个人信息,如名字,姓氏,汽车品牌以及汽车模型。
我不希望此人的个人信息存储在与汽车信息相同的表格中。
我也希望能够使用personId
检索汽车信息,这就是我在Car课程中personId
的原因。
我应该使用哪些注释来完成此操作?显然我需要对Car
表进行约束并使personId
成为外键,对吧?什么是最好的方式?
我见过不同的东西,最好的是什么?
答案 0 :(得分:1)
在Car类中,替换
@Column(name="personId")
private String personId;
与
@ManytoOne(fetch = FetchType.LAZY)
@CJoinColumn(name="person")
private Person person;
在Person类中,添加
@OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
private List<Car> cars;
您现在正在形成双向one-to-many
,这意味着您可以检索汽车的人与人(拥有者)的汽车。
级联允许在人员保存时保存或更新汽车。移除此人后,所有汽车也会被删除。
答案 1 :(得分:0)
这取决于您的要求。 如果您想为多个用户使用同一车辆,那么您应该将其作为一个实体,并使用多对多关系。
如果您根本不想更改实体结构,而只想更改数据库映射,请查看@SecondaryTable
和@SecondaryTables
注释,它们为实体定义更多表,然后您将指定每列使用哪个表(否则将它们分配给主表)。