JPA 2 / Hibernate - Лучший способ обновить сложные объекты? - PullRequest
0 голосов
/ 20 февраля 2011

Я новичок в JPA / Hibernate и мне интересно, каков обычно лучший способ обновления сложной сущности?

Например, рассмотрим сущность ниже:

@Entity
public class Employee {

    @Id
    private long id;
    @Column
    private String name;
    @ManyToMany
    private List<Positions> positions;

    // Getters and setters...

}

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

for (long positionId : positionIdList) {
    Position position = entityManager.find(positionId);
    employee.getPositions.add(position);
}

entityManager.persist(employee);

Однако, когда дело доходит до обновления сотрудника, я не уверен, каким будет лучший способ обновления должностей сотрудников. Я думаю, что есть два варианта:

  1. Я анализирую список идентификаторов позиций и определяю, нужно ли добавлять / удалять позицию (это не кажется забавным процессом и может закончиться множеством запросов на удаление)

  2. Я удаляю все позиции, а затем снова добавляю указанные позиции. Есть ли способ в JPA / Hibernate удалить все дочерние элементы (в данном случае позиции) с помощью одной команды sql?

Думаю ли я об этом неправильно? Что вы, ребята, рекомендуете?

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Как насчет

employee.getPositions.clear(); // delete all existing one
  // add all of them again
 for (long positionId : positionIdList) {
    Position position = entityManager.find(positionId);
    employee.getPositions.add(position);
}

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

1 голос
/ 20 февраля 2011

JPA / Hibernate имеет поддержку для этого.Это называется каскадом.Используя @ManyToMany(cascade=CascadeType.ALL) (или ограничивая тип каскада PERSIST и MERGE), вы указываете, что коллекция должна быть сохранена (объединена / удалена и т. Д.), Когда владельцем является объект.

При удаленииЭто касается особого случая, когда объекты становятся «сиротами» в базе данных.Это обрабатывается установкой orphanRemoval=true

...