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();
}
Ребенок 1:
@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;
}
Ребенок 2:
@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") ---> @JoinColumn(name = "customer_idx")
тогда это работает, и я могу правильно сохранить 0..* номеров телефонов для каждого клиента.< /p>
Но эта модификация создает дурацкую структуру таблицы:
[img]https://i. sstatic.net/fzfS0jJ6.png[/img]
Чего мне здесь не хватает?
Я могу создать правильную структуру с помощью простых SQL-запросов и использовать customer_id в качестве внешнего ключа в дочерних таблицах. Но почему JPA генерирует дополнительное неожиданное ограничение?
---------- ОБНОВЛЕНИЕ ----------
Я тоже пробовал то же самое, прежде чем опубликовать этот вопрос, но результат оказался не таким, как я ожидал. Я снова изменил аннотации JPA в соответствии с предложениями и получил следующее:

JPA не устанавливает внешние ключи в дочерней таблице.
В настоящее время я использую следующие настройки, они предоставляют мне ожидаемая структура БД:
@Entity
@Table(name = "customer")
@Data
public class CustomerDto {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customer-id-sequence")
@SequenceGenerator(name = "customer-id-sequence", sequenceName = "customer_id_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
...
...
@Column(name = "notes")
private String notes;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "customer_id")
private List emails = new ArrayList();
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "customer_id")
private List
phones = new ArrayList();
}
Ребенок:
@Entity
@Table(name = "email")
@Data
public class EmailDto {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "email-id-sequence")
@SequenceGenerator(name = "email-id-sequence", sequenceName = "email_id_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
@Column(name = "email", unique = true, length = 128)
private String email;
@ManyToOne()
private CustomerDto customer;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... reate-drop