当前位置: 首页 > 知识库问答 >
问题:

Hibernate:在@PostUpdate中抛出异常

武博艺
2023-03-14

我在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);
    }
}

此代码在文章实体上每次更新或持久化后调用。问题在于,当为负数量引发异常时,hibernate将RuntimeException上的BusinessException转换为,并执行事务回滚。

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个答案

冯元魁
2023-03-14

该异常在调用 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;
    }
}
 类似资料:
  • 我试图建立简单的一对多关系,但hibernate抛出了错误,不知道该怎么办。 类产品: 和类用户: 我遇到了错误:通过JDBC语句执行DDL“alter table products drop constraint fk_user”时出错

  • 我在Quarkus REST应用程序中有几个接受ID的调用。 我使用活动记录模式来处理数据库请求。来自Spring的将在结果集为空时抛出异常。我将使用捕获此异常,并抛出相应的响应代码(在本例中为404)。这也适用于所有其他例外情况。 有没有办法将Panache/Hibernate配置为在空结果集上抛出异常?现在,我必须手动检查结果是否为空/空,然后抛出相应的异常。 例如,这就是我现在要做的: 当我

  • 我正在使用以下命名查询: 该查询在mysql中运行良好: 但当我试图运行我的代码时,我得到了QuerySyntaxException:

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 我想在我的存储库层中有一个选项来渴望加载实体,所以我尝试添加一种方法来渴望加载具有所有关系的问题实体,但是它会抛出MultipleBagFetchException。我怎样才能解决这个问题?我正在使用Hibernate 4.16。 我如何获得一个最初是延迟加载的问题对象,以期渴望加载所有关系? 问题答案: 在Hibernate和通常的ORM中,这是一个相当棘手的问题。 发生的情况是,许

  • 问题内容: 我有一个关于Java中重新引发异常的非常简单的问题。 这是代码片段: 为什么我们需要在第一个版本中重新抛出,而第二个版本看起来更优雅?可能有什么好处,并且优先选择哪个版本? 问题答案: 你是对的。第二版更好。而且,第一个版本没有任何意义。除了异常的堆栈跟踪为“错误”之外,它的功能相同。 有“重新抛出”异常的原因如下: 如果您之前有事要做。 如果捕获一种类型的异常并抛出另一种类型的异常: