viperz
@viperz
inspired by Java

Hibernate — как сделать такую связь?

В моем дизайне есть зеркальная связь один ко многим, и они не пересекаются.

Т.е. есть Entity1, Entity2 , у каждой есть свой id и другие свойства. И есть операционная таблица, в которой хранятся entity1_id, entity2_id и еще некоторые свойства посчитанные бизнес логикой.
В данном случае entity1_id может соответствовать многим entity2_id , и наоборот, но например если entity1_id уже в связи один ко многим, то он не попадет в многие к одному, с точки зрения бизнес логики совпадение entity1->entity2 один к одному.

Как это выразить с помощью Hibernate? Все мои попытки закончились на том, что хибернейт либо создавал кросс FK на таблицы Entity1 и Entity2, либо создавал entity1_id в таблице Entity2 и наоборот.

Важный момент в том, что связь между этими Entity достаточно динамична, т.е. связь создается не во время создания этих сущностей, а в результате бизнес-логики. Кроме того , эта связь в жизненном цикле сущностей может пропадать в случае некоторых бизнес правил.

@Entity
public class BuyOrder {
  @Id
  private String id;
//... other fields
}

@Entity
public class SellOrder {
  @Id
  private String id;
//... other fields
}


@Entity
public class MatchedOrders {
  @Id
  private String id;

  private String buyOrderId;
  private String sellOrderId;
//... other fields
}


Buy и SellOrder не должны знать про связку друг друга через MatchedOrders.
Записи в MatchedOrders появляются гораздо позже после создания Sell и BuyOrder.

В итоге хотелось бы , чтобы на уровне схемы базы таблица matched_orders осталась как выше описан класс MatchedOrders, а видеть MatchedOrders.class так:

@Entity
public class MatchedOrders {
@Id
private String id;

private Set buyOrders;
private Set sellOrders;
//... other fields
}
  • Вопрос задан
  • 221 просмотр
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Как я понимаю, вам нужен composite key. Вот здесь почитать как в нескольких вариантах https://vladmihalcea.com/the-best-way-to-map-a-com...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы