сопоставление jpa для удаления одинокой сущности - PullRequest
1 голос
/ 17 сентября 2011

В моем java web app (с использованием playframework) у меня есть Customer с отображением Address следующим образом

@Entity
class Customer extends Model{
    @ManyToOne
    Address address;
...
}

@Entity
class Address extends Model{
    String addressline1;
   ...
}

У меня есть метод setCustomerAddress (..), который принимает пользователяinput, извлекает сопоставленный адрес из базы данных или создает новый адрес, а затем, если адрес клиента является нулевым или другим, устанавливает адрес ввода.

public static void setCustomerAddress(...){
   Customer = Customer.findById(custId);
   Address address = findOrCreateAddress(addressline1,...);
   if ((customer.getAddress()==null) || (!customer.getAddress().equals(address))) {
    customer.setAddress(address);
    customer.save();
}
...
}

customer1 создает Address1.customer2 вводит один и тот же Address1.

теперь оба имеют Address1;

id | addressline1 | addressline2 | country 
----+--------------+--------------+---------
 25 |apple st.     |              | US


id  |name          |address_id
----+--------------+------------
1   |jim           |25
2   |roy           |25

, если customer2 добавляет адресную строку2, адрес считается другим, поэтому создается новый адрес

addressТаблица

 id | addressline1 | addressline2 | country 
----+--------------+--------------+---------
 25 |apple st.     |              | US
 26 |apple st.     |richman's end | US

Таблица клиентов

id  |name          |address_id
----+--------------+------------
1   |jim           |25
2   |roy           |26

Предположим, клиент1 обновляет свой адрес, добавляя ту же адресную строку2, что и клиент2, теперь его address_id указывает на адрес таблицы клиентов customer2

id  |name          |address_id
----+--------------+------------
1   |jim           |26
2   |roy           |26

Это оставляет адресную запись (25), которая не принадлежит ни одному клиенту.

Должна ли она быть оставлена ​​в БД или должна быть удалена? Какая надлежащая практика? ManyToOne не позволяетдля любого orphanRemoval, я думаю. Я должен очистить это в коде, может быть, делать некоторые проверки для таких одиноких объектов?

Любые указатели будут приветствоваться

1 Ответ

1 голос
/ 17 сентября 2011

Удаление сирот может быть выполнено только для аннотированных отношений @OneToOne и @OneToMany в JPA 2.0.

В случае @ManyToOne удаление сирот не является допустимым термином, так как вы пытаетесьпредположительно удалили «родителя», когда не существует дочерних объектов.Это совсем другой сценарий по сравнению с удалением дочерней сущности, когда у нее нет родителя (т. Е. Она была осиротевшей).

Если вы считаете, что Address записи должны быть удалены в базе данных, когда нетCustomer записей существует, вы должны написать код для удаления сущности Address, когда никакие сущности Customer не ссылаются на нее.Я не знаю об остальном вашем коде, но это похоже на работу для SQL (нативного) или JPQL-запроса для извлечения всех таких Address es.

Обратите внимание, что невозможно использоватьфункция удаления потерянных объектов в JPA 2.0 в этом случае по причине, указанной ранее.Следовательно, создание двунаправленного отношения с аннотированным свойством @OneToMany в вашей сущности Address (с атрибутом orphanRemoval, установленным в значение true) не приведет к удалению записей Address, на которые нет ссылок.Однако вы можете создать двунаправленную связь, чтобы избежать использования запроса SQL или JPQL (поскольку вы можете подсчитать количество Customer s в свойстве коллекции Address).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...