JPA @OneToMany с отношениями 1 - 1 .. * - PullRequest
0 голосов
/ 05 сентября 2018

Как правильно отобразить @OneToMany отношение, где для создания сущности, на @One стороне отношения @OneToMany, требуется иметь хотя бы один объект со стороны @Many, но для объекта на @Many стороне также требуется объект на @One стороне существовать? Проще говоря, этот кошмар предложения - вот сценарий, который у меня есть:

Вот что я хочу:

[ENTITY A] 1 <-----> (1..*)[ENTITY B]

На данный момент у меня есть это:

[ENTITY A] 1 <-----> (0..*)[ENTITY B]

Что легко сделать вот так.

@OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
public Set<Agreement> agreements = new HashSet<>();

и

@ManyToOne
@JoinColumn(name = "CUSTOMER_ID", nullable=false)
private Customer customer;

Итак, проблема в том, что в моей таблице CUSTOMER нет столбца, соответствующего таблице AGREEMENT, поэтому я не могу применить правило создания Customer, только когда задано Agreement. В настоящее время я могу настроить правило для создания Agreement только тогда, когда задано Customer, потому что таблица AGREEMENT имеет столбец, соответствующий таблице CUSTOMER, что легко сделать из условия nullable=false.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

JPA не предоставляет способ проверить это, но Hibernate Validator делает:

@NotNull
@Size(min=1)
public Set<Agreement> agreements = new HashSet<>();

Затем вы должны вручную проверить его через валидатор:

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
validator.validate(customer)
0 голосов
/ 05 сентября 2018

Это очень сильно зависит от того, какой тип отношений вы хотите установить. Если Соглашение может существовать независимо от Клиента, это означает, что customer_id в соглашении должен иметь значение NULL.

Если Соглашение не может существовать независимо, это предполагает, что идентификатор клиента не может иметь значение NULL, и в этом случае Соглашение не может быть создано в первую очередь без создания клиента. Это означает, что у вас более тесная связь между клиентом и соответствующим соглашением.

Как только мы определили, что у нас сильные отношения, нам нужно выяснить, насколько они сильны на самом деле и кому они будут принадлежать. Как правило, именно сторона «Множество» владеет отношениями, и обновления происходят через «много сторон». Это означает, что ваш JoinColumn должен быть на МНОГОМ, а сопоставленный - на ОДНОЙ стороне.

Это интересный случай, когда право собственности является обратным, когда ОДНАЯ сторона фактически владеет отношением, в этом случае внешний ключ на стороне многих не может быть НЕДЕЙСТВИТЕЛЕН, потому что нет никакой возможности для ОДНОЙ стороны-владельца знать, что такое МНОГИЕ стороны. ключ.

...