如何避免 Hibernate ValidationException 上的自动实体更新
Posted
技术标签:
【中文标题】如何避免 Hibernate ValidationException 上的自动实体更新【英文标题】:How to avoid automatic entity update on Hibernate ValidationException 【发布时间】:2015-07-23 09:33:22 【问题描述】:我有一个spring
方法:我在构造对象后验证实体,该对象之前是从数据库中获取的。
@Transactional(rollbackFor=ValidationException.class)
public Object approve(Command command) throws ValidationException
Object obj = merger.mergeWithExistingobject(command); // where I am fetching object from DB with old values and construct the new object
validatorService.validate( obj ); // which throws ValidationException
return saveObject(obj);
但不幸的是,即使在ValidationException
被抛出之后。这些值仍然保留在数据库中。我怎样才能避免这种情况。
【问题讨论】:
您确定您没有在mergeWithExistingobject
中提交更改吗?
validatorService
是否处于弹簧控制之下?请张贴ValidatorService
代码。
@Suganthan 你能提供异常日志吗?
@DraganBozanovic,是的,我确定。我正在从数据库中获取一个对象并更新它的新更改。
@PawełGłowacz 是的,它是 Spring 托管 bean
【参考方案1】:
你可以驱逐ValidationException
上的实体:
try
validatorService.validate( obj );
catch (ValidationException e)
entityManager.detach(obj);
//Or with Hibernate API
//session.evict(obj);
throw e;
【讨论】:
【参考方案2】:我从未使用过 spring,但如果它与 EJB 相同,那么只有在引发未经检查的异常时才会回滚事务。
当从 EJB 方法抛出 java.lang.Exception 时,您显然必须在方法的签名中使用 throws 关键字声明它。在这种情况下发生的情况如下 1) 事务被提交 2) 异常被重新抛出给客户端
取自this link
【讨论】:
是的,你是对的。但就我而言,即使exception
抛出。事务将被提交,因为如果 isDirty
检查以上是关于如何避免 Hibernate ValidationException 上的自动实体更新的主要内容,如果未能解决你的问题,请参考以下文章
覆盖spring web mvc的默认Hibernate Validator
JSR303/JSR-349,hibernate validation,spring validation 之间的关系
hibernate validation 手动参数校验 不经过spring
Hibernate Validator表单验证异常javax.validation.UnexpectedTypeException问题