我在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
实体上保留。
问题是当为负数量抛出异常时,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抛出一个已检查的异常,而不是运行时?当抛出异常时,我不想要回滚事务。
感谢。
答案 0 :(得分:0)
调用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;
}
}