使用一对一关系时的设计决策

时间:2015-10-09 06:15:32

标签: oracle hibernate data-modeling

我有以下实体,我对设计设计有疑问,应该DRIVING_LICENSE表包含外键PERSON_IDPERSON表应该有LICENSE_NUMBER作为外键来自DRIVING_LICENSE表?

  1. 如果PERSON表有LICENSE_NUMBER,那么PERSON表将是子表,DRIVING_LICENSE将是父表,因此它暗示当驾驶执照是删除然后该人应删除。

  2. 另一方面,如果DRIVING_LICENSE将有一个PERSON_ID,那么在hibernate中的单向一对一关系中,我们将无法使用DrivingLicense的引用我们会在Person中引用DrivingLicense,但大多数情况下我们需要访问Person而不是DrivingLicense

  3. 以上两个是我的主要疑虑?什么是正确的选择,它的优点和缺点是什么?

    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;
    }
    

1 个答案:

答案 0 :(得分:2)

驱动程序许可证应包含具有唯一约束的人员的NOT NULL外键,原因如下:

  1. 每个许可 必须 与某个人相关联。
  2. 某人可能 与之关联的一个许可。
  3. 由于许可证必须与某人相关联,但某人不需要许可证,因此外键应由许可证表保存。

    外键的唯一约束将强制执行一对一关系。没有它,你就会有一对多的关系。