JPA настаивает на создании уникального ограничения для отношения FK «один-ко-многим» на дочерней стороне. Это ограничение не позволяет мне вставить более одной записи в дочернюю таблицу.
Родительский объект:
Код: Выделить всё
@Entity
@Table(name = "customer")
@Data
public class CustomerDto {
@Id
private Long id;
...
@Column(name = "notes")
private String notes;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private List emails = new ArrayList();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private List
phones = new ArrayList();
}
Код: Выделить всё
@Entity
@Table(name = "email")
@Data
public class EmailDto {
@Id
private Long id;
@Column(name = "email", unique = true, length = 128)
private String email;
@ManyToOne(fetch = FetchType.LAZY)
private CustomerDto customer;
}
Код: Выделить всё
@Entity
@Table(name = "phone")
@Data
public class PhoneDto {
@Id
private Long id;
@Column(name = "phone_number", nullable = false, length = 32)
private String phoneNumber;
@OneToOne(fetch = FetchType.LAZY)
private CustomerDto customer;
}
[img]https://i.sstatic.net /lG0nhCx9.png[/img]
Но это также создает дополнительное ограничение для внешнего ключа на стороне телефона:

Таблица электронной почты выглядит нормально:

Уникальный контент, который Hibernate генерирует на стороне телефона, позволяет мне вставить ТОЛЬКО ОДНУ запись для каждого клиента. Если я пытаюсь вставить два номера телефона, я получаю повторяющееся значение ключа, что нарушает уникальное ограничение "phone_customer_id_key".
Если я изменю определение JoinColumn в CustomerDto.java вот так:
Код: Выделить всё
@JoinColumn(name = "customer_id")
тогда это работает, и я могу правильно сохранить 0..* номеров телефонов для каждого клиента .
НО эта модификация создает дурацкую структуру таблицы:
[img]https:// i.sstatic.net/fzfS0jJ6.png[/img]
Чего мне здесь не хватает?
Я могу создать правильную структуру с помощью простых SQL-кодов и Я могу использовать customer_id в качестве внешних ключей в дочерних таблицах. Но почему JPA генерирует дополнительное неожиданное ограничение?
Подробнее здесь: https://stackoverflow.com/questions/787 ... reate-drop