java - Hibernate:在@PostUpdate 中抛出异常
问题描述
我在 Spring/Hibernate webapp 上有这段代码:
实体 :
@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
实体上。问题是当为负数引发异常时,休眠转换BusinessException
on aRuntimeException
并执行事务回滚。
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 抛出一个检查异常而不是运行时?我不想在抛出异常时回滚事务。
谢谢。
解决方案
调用 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;
}
}
推荐阅读
- python - 试图标准化/规范化数据以进入 CNN,但遇到问题
- javascript - 如何在 React 中将数据传递给 Chart.js 图表
- node.js - puppeteer - 获取元素句柄的完整 x 路径
- c# - 发出属性的显式接口实现
- reactjs - React-Native 暗模式不起作用:)
- audiokit - 持续时间为倍数的 AKPlayer 是否支持同步循环?
- python - 如何使if语句按顺序执行?
- regex - .htaccess 漂亮的 url 格式不剥离斜杠
- antlr4 - 输入 ANTLR4 没有可行的替代方案?
- javascript - JavaScript:恰好在 currentTime=x 停止 HTML5 视频