Я следующие сущности, я в сомнении о дизайне конструкции, как следует DRIVING_LICENSE
таблица содержит внешний ключ PERSON_ID
или PERSON
таблицы должна иметь LICENSE_NUMBER
в качестве внешнего ключа из DRIVING_LICENSE
таблицы?дизайнерского решения при использовании 12:59 отношений
Если
PERSON
таблица имеетLICENSE_NUMBER
тоPERSON
таблица будет подчиненная таблица иDRIVING_LICENSE
будет родительская таблица, поэтому это означает, что, когда водительские права удаляется, то человек должен быть удален.С другим путем, если
DRIVING_LICENSE
будетPERSON_ID
затем в уни направленного отношения один к одному в спящем режиме, мы не сможем иметь ссылку на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;
}
Ваше первое предположение неверно: при удалении водительских прав вы не должны удалять человека. Вам просто нужно установить личность человека в значение null. Ваше второе предположение также странно: отсутствие ссылки на водительские права в Person не имеет никакого отношения к тому, где находится внешний ключ. Это связано с тем, что вы явно решили сделать объединение однонаправленным. Но если естественная навигация от человека к водительским удостоверениям, то идите для первого. –
@ JBNizet еще одна проблема заключается в том, что если я пойду с 1-го предположения, тогда удаление человека будет хлопотно, потому что мне сначала нужно будет удалить водительские права, а затем лицо. Итак, что вы предлагаете, является хорошей практикой и с которой мне следует пользоваться при использовании однонаправленного OneToOne? – eatSleepCode
За свою жизнь у Prson может быть более одной водительской лицензии, например. Предварительное (во время обучения) и Полное после того, как они прошли. Или скажите водительское удостоверение такси. Независимо от того, как ваша модель действительно реализует эти детали, это не соотношение 1: 1. Более философски, лицо обращается за лицензией. Лицензия не существует перед приложением. Так что, как бы мы ни смотрели на это, PERSON является родительской таблицей, а LICENSE зависит. – APC