我有以下实体,我对设计设计有疑问,应该DRIVING_LICENSE
表包含外键PERSON_ID
或PERSON
表应该有LICENSE_NUMBER
作为外键来自DRIVING_LICENSE
表?
如果PERSON
表有LICENSE_NUMBER
,那么PERSON
表将是子表,DRIVING_LICENSE
将是父表,因此它暗示当驾驶执照是删除然后该人应删除。
另一方面,如果DRIVING_LICENSE
将有一个PERSON_ID
,那么在hibernate中的单向一对一关系中,我们将无法使用DrivingLicense
的引用我们会在Person
中引用DrivingLicense
,但大多数情况下我们需要访问Person
而不是DrivingLicense
。
以上两个是我的主要疑虑?什么是正确的选择,它的优点和缺点是什么?
DrivingLicense.java
@Entity
@Table(name = "DRIVING_LICENSE")
public class DrivingLicense {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "LICENSE_NUMBER")
private int licenseNumber;
@Column(name = "DATE_OF_ISSUE")
private Date dateOfIssue;
@OneToOne
@JoinColumn(name = "PERSON_ID")
private Person person;
}
和
Person.java
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PERSON_ID")
private int personId;
@Column(name = "PERSON_NAME", nullable = false, length = 30)
private String personName;
@OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
private DrivingLicense drivingLicense;
}
答案 0 :(得分:2)
驱动程序许可证应包含具有唯一约束的人员的NOT NULL
外键,原因如下:
由于许可证必须与某人相关联,但某人不需要许可证,因此外键应由许可证表保存。
外键的唯一约束将强制执行一对一关系。没有它,你就会有一对多的关系。