Hibernate Entitymanager удалить элегантно без исключения? - PullRequest
6 голосов
/ 02 декабря 2010

Есть ли более элегантный способ избежать javax.persistence.EntityNotFoundException при вызове EntityManager.remove() для объекта, который может или не может существовать в настоящее время в постоянном состоянии? Я пытаюсь избежать ситуации, когда мне нужно сделать 2 запроса, чтобы удалить объект. В настоящее время я изменяю с:

void remove(String id) {
    T model = entityManager.getReference(type, id);
    entityManager.remove(model);
}

Но это вызовет исключение, если модель не существует.

Я мог бы:

void remove(String id) {
    T model = retrieve(id);
    if(model != null)
        entityManager.remove(model);
}

Но это потребовало бы 2 запросов (пока отложено понятие кэша).

Ответы [ 2 ]

0 голосов
/ 04 сентября 2013

Вы можете сделать select count(*) from ENTITY where id = :id перед удалением вашей сущности, а затем проверить, существует ли сущность в базе данных. Таким образом, вы можете удалить без исключения. Если вы используете общий DAO с общими методами, такими как find(), persist(), remove() ..., вы можете добавить запрос count(*) в методе remove().

Надеюсь, это поможет.

0 голосов
/ 25 января 2011

Единственная возможность - использовать запрос с предложением DELETE и WHERE.Работает нормально, за исключением того, что JPA не будет вызывать какие-либо операции @PreDelete или @PostDelete для удаляемого объекта.Я предполагаю, что вы все равно этого не хотите, так что иди с запросом.Если вы хотите вызвать слушателей, объект (очевидно) должен быть загружен до удаления.

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