4.2.3.1. Прямая ассоциация Many-to-Many
Рассмотрим реализацию ассоциации many-to-many на примере сущностей Airport и Airline. Один аэропорт может принимать множество авиакомпаний, и одна авиакомпания-перевозчик, в свою очередь, может осуществлять рейсы во множество аэропортов.
-
Airport.java - сущность
Airportсодержит many-to-many список авиакомпаний.В редакторе сущностей Studio установите следующие свойства для атрибута
airlines: Attribute type -ASSOCIATION, Cardinality -MANY_TO_MANY.Сущность
Airportбудет отмечена ведущей стороной ассоциации, и Studio предложит создать соответствующий атрибутairportsв сущностиAirlineна противоположной стороне отношений.@JoinTable(name = "SAMPLE_AIRLINE_AIRPORT_LINK", joinColumns = @JoinColumn(name = "AIRPORT_ID"), inverseJoinColumns = @JoinColumn(name = "AIRLINE_ID")) @ManyToMany protected List<Airline> airlines; -
Airline.java - сущность
Airlineтеперь содержит many-to-many список аэропортов: Attribute type -ASSOCIATION, Cardinality -MANY_TO_MANY.@JoinTable(name = "SAMPLE_AIRLINE_AIRPORT_LINK", joinColumns = @JoinColumn(name = "AIRLINE_ID"), inverseJoinColumns = @JoinColumn(name = "AIRPORT_ID")) @ManyToMany protected List<Airport> airports;Сущность
Airlineтакже будет отмечена как ведущая сторона отношений, что позволяет редактировать коллекции с обеих сторон. -
views.xml - представление
airport-airlinesэкрана редактирования аэропорта содержит ссылки на авиакомпании с представлением_minimal. Представлениеairline-airports, в свою очередь, также содержит ссылки на аэропорты. -
airport-edit.xml - XML-дескриптор экрана редактирования аэропорта определяет источник данных для экземпляра аэропорта и вложенный источник для его авиакомпаний. Кроме того, экран содержит таблицу, отображающую авиакомпании, и действия add и remove для неё.
-
airline-edit.xml - XML-дескриптор экрана редактирования авиакомпании определяет источник данных для экземпляра авиакомпании и вложенный источник данных для её аэропортов. Кроме того, экран содержит таблицу, отображающую аэропорты, и действия add и remove.
Таким образом, экраны редактирования сущностей
AirportиAirlineполностью симметричны.
В результате редактирование экземпляра авиакомпании работает следующим образом:
В экране редактирования авиакомпании отображается список аэропортов.
Пользователь может нажать Add и в открывшемся экране выбора сущности Airport либо выбрать аэропорт, который нужно добавить, либо открыть экран его редактирования. При нажатии OK в экране редактирования аэропорта изменённый экземпляр аэропорта сохраняется как в базу данных, так и в источник данных airportsDs экрана редактирования авиакомпании, так как сущность Airport является полностью независимой.
Пользователь может создавать новые аэропорты или удалять их, и все изменения будут сохраняться и в базу данных в отдельных транзакциях, и в источник данных airportsDs.
Пользователь нажимает OK в экране редактирования авиакомпании, и изменённый экземпляр Airline вместе со всеми ссылками на экземпляры Airport отправляется на middleware в метод DataManager.commit(), чтобы быть сохранённым в базе данных.
На другой стороне отношений в экране редактирования сущности Aiport работает ровно тот же принцип.