我在JPA2 / Hibernate / Guice环境中处理ConstraintViolationException
和RollbackException
时遇到问题。这两个异常都在bean验证时发生,但是:
当我尝试保留新实体时抛出ConstraintViolationException
当我尝试将实体合并到上下文中时发生RollbackException
这是在表单处理(创建和更新实体)并捕获这些异常很烦人的时候发生的:
try {
// service.method is annotated with @Transactional
entity = service.create(formEntity);
} catch (RollbackException re) {
// occurs while merging the entity
if (re.getCause() instanceof ConstraintViolationException) {
errors.process((ConstraintViolationException) re.getCause());
}
} catch (ConstraintViolationException cve) {
// occurs while persisting the entity
errors.process(cve);
}
我不想添加另一个控制流并捕获所有
RuntimeException
:try {
// bean validation fails (merge / persist)
} catch (RuntimeException ex) {
if (errors.process(ex)) {
// do something with entity
}
}
是否有可能以某种方式强迫休眠以不将CVE包装到RE中?处理和处理此类异常的最透明,最干的方法是什么?
谢谢
最佳答案
hibernate将所有sql异常包装为RuntimeException
(hibernate的功能)..您得到ConstraintViolationException
的原因可能是因为某些字段不接受空值,并且在插入时传递了空值。 (如果未显式设置pojo属性的值,则在插入时将其视为null)...