Hibernate: выбросить исключение в @PostUpdate - PullRequest
0 голосов
/ 28 мая 2018

У меня есть этот код в веб-приложении Spring / Hibernate:

Объект:

@Entity
@Table(name = "ARTICLE")
@EntityListeners(ArticleEntityListener.class)
public class ArticleLocaliseBean extends EntiteTracee {
...

Слушатель:

public class ArticleLocaliseEntityListener {
@PostUpdate
@PostPersist
private void checkQuantite(ArticleBean article) throws BusinessException {
    if (article.getQuantiteStock() < 0) {
        throw new BusinessException(exceptionMsg);
    }
}

Этот код вызывается после каждого обновления или сохраняетсяна Article сущность.Проблема заключается в том, что при возникновении исключения для отрицательного количества hibernate преобразует BusinessException в RuntimeException и выполняет откат транзакции.

java.lang.RuntimeException: xxx.exceptions.BusinessException: exceptionMsg.
at org.hibernate.ejb.event.ListenerCallback.invoke(ListenerCallback.java:53)
at org.hibernate.ejb.event.EntityCallbackHandler.callback(EntityCallbackHandler.java:94)
at org.hibernate.ejb.event.EntityCallbackHandler.postUpdate(EntityCallbackHandler.java:83)
at org.hibernate.ejb.event.EJB3PostUpdateEventListener.handlePostUpdate(EJB3PostUpdateEventListener.java:70)
at org.hibernate.ejb.event.EJB3PostUpdateEventListener.onPostUpdate(EJB3PostUpdateEventListener.java:62)
at org.hibernate.action.EntityUpdateAction.postUpdate(EntityUpdateAction.java:199)

Как сделать так, чтобы Hibernate выбрасывал проверенное исключениене время выполнения?Я не хочу откат транзакции при возникновении исключения.

Спасибо.

1 Ответ

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

Исключение выдается при вызове метода API, такого как persist () .Однако эти методы не объявлены для создания исключений (в их подписи нет условия throws).Hibernate должен обернуть любое проверенное исключение в исключение времени выполнения для соблюдения сигнатуры метода.

Чтобы избежать отката, вы можете перехватить исключение времени выполнения и проверить его причину.

try {
    em.persist(entity);
} catch (RuntimeException e) {
    if (e.getCause() instanceof BusinessException) {
        // Fix the problem the way you want
    } else {
        throw e;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...