JPA Hibernate ManyToMany, каскадные и FK - PullRequest
0 голосов
/ 06 мая 2018

Я преобразую управление базой данных моего проекта из JDBC MySQL в JPA Hibernate, база данных должна остаться прежней. (От простого API Джерси до Spring с API Hibernate).

Есть таблицы для Фирма , Клиент и Купоны . Каждая Компания может управлять многими купонами , и каждый Клиент может также «приобрести» много купонов .

Поэтому у меня есть таблица соединений с именем company_coupon и другая таблица с именем customer_coupon .
Когда Компания удаляется, если Купон не принадлежит какой-либо другой Компании - таким образом, нет менеджера - Купон удаляется, и в результате как и все отношения ( company_coupon и customer_coupon ).

При удалении Клиента, отношение в coupon_customer также должно быть удалено.

Это похоже на отношения OneToMany , поскольку Купон не должен знать, кто его владельцы, (Компания управляет купонами, Клиент владеет купонами), но все, что я нашел относительно JPA Hibernate и таблиц соединений, указывает на то, что это отношение ManyToMany , что меня смущает.

Как определить, что я описал в JPA Hibernate?


Кроме того, я имел обыкновение иметь архивные таблицы для всего, удаляя их из исходных таблиц. что может усложнить обработку вещей.
Поэтому я добавил к каждому поле ' удалено ' и настроил функцию удаления объекта, чтобы изменить его удаленное состояние на истинное с помощью:

@SQLDelete(sql = 
        "UPDATE " + TableHelper.TBL_COMPANY 
        + " SET " + TableHelper.REMOVED + " = true"
        + " WHERE " + TableHelper.COMPANY_KEY + " = ?")

Теперь, если вы попытаетесь удалить компанию, изменится только значение ' Удалено '.
Но я хочу, чтобы все купоны, которые остались неуправляемыми - без отношения к какой-либо существующей, неархивированной компании - также были заархивированы.

Действительно сложный процесс только для управления данными ... есть идеи, как это сделать эффективно?

Заранее спасибо:)

1 Ответ

0 голосов
/ 06 мая 2018

все, что я нашел относительно JPA Hibernate и таблиц соединений, указывает на то, что это отношение ManyToMany

«Каждая компания может управлять многими купонами» и «если купон не принадлежит какой-либо другой компании (= купон может принадлежать более чем одной компании)» в тот факт, что Coupon - Company является ассоциацией «многие ко многим» . Тот факт, что «Купон не должен знать, кто его владельцы», говорит вам лишь о том, что это, вероятно, однонаправленная ассоциация.

Когда Клиент удаляется, отношения в coupon_customer также должны быть удалены.

Это произойдет автоматически, при условии, что Customer является принимающей стороной отношений (и, так как вы все равно хотите сделать это однонаправленной ассоциацией, у вас нет других вариантов). Просто объявите Customer.coupons как ассоциацию «многие ко многим» следующим образом:

@ManyToMany
@JoinTable(name = "customer_coupon", joinColumns = ..., inverseJoinColumns = ...)
private Set<Coupon> coupons;

При удалении компании, если купон не принадлежит какой-либо другой компании, то есть у него нет менеджера, купон удаляется, и в результате также возникают все отношения (company_coupon и customer_coupon).

JPA не позаботится об этом за вас. Ваше приложение должно будет обнаружить и обработать такой сценарий как часть своей бизнес-логики (это может звучать как потенциальная проблема с производительностью, но, опять же, как часто компания будет фактически удалена?)

...