JPA и DAO реализация операции удаления - PullRequest
5 голосов
/ 12 ноября 2011

Я хотел бы знать, какая реализация метода удаления лучше:

public void remove(T t) {
   entityManager.remove(entityManager.merge(t));
}

public void remove(PK pk) {
   entityManager.remove(entityManager.getReference(entityType, pk));
}

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

1 Ответ

1 голос
/ 12 ноября 2011

Вы можете проверить, управляется ли сущность, вызвав

boolean isManaged = entityManager.contains( t );

Если true, просто позвоните

entityManager.remove(t);

, иначе ваш второй подход выглядит лучше, так как слияние может привести к большей активности БД из-занетерпеливая загрузка (если настроено).Javadoc на getReference говорит: «Получить экземпляр, состояние которого может быть отложено извлечено. Если запрошенный экземпляр не существует в базе данных, выдает исключение EntityNotFoundException при первом обращении к состоянию экземпляра. (Среда выполнения поставщика постоянстваразрешено выбрасывать EntityNotFoundException при вызове getReference (java.lang.Class, java.lang.Object).) Приложение не должно ожидать, что состояние экземпляра будет доступно после отсоединения, если оно не было доступно приложению, пока менеджер сущностей былopen. "

Короче говоря, сущностью нужно управлять, поэтому я бы предложил:

em.remove(em.contains(r) ? r : em.merge(r));
...