2012-08-08 59 views
2

我在Spring MVC應用程序中使用Hibernate驗證器。 我在context.xml中配置它即使Hibernate Validator驗證失敗,Hibernate也會更新持久對象

<bean id="validator" class="com.mycompany.appname.validation.Validator" />

現在我用它在我的控制器,以驗證不同的對象。 這對於瞬態對象是可以的,但持久對象怎麼樣?對於e.x:

我加載一個:

MyObject o = myDao.getById(someId); 
o.setName(name); 
o.setPhone(phone); 
Set<ConstraintViolation<o>> violations= validator.validate(o); 

在Hibernate更新它,即使驗證此對象的失敗!

我試圖詮釋的Validatorvalidate()

@PrePersist 
@PreUpdate 
@PreRemove 
public <RT> Set<ConstraintViolation<RT>> validate(RT target){...} 

但儘管如此,如果驗證失敗或者不更新不管。 如果驗證失敗,我不想拋出異常。

回答

1

您可以配置Hibernate自動更新之前執行驗證,請參閱7.3. ORM integration。如果您不想在驗證失敗的情況下執行特定操作,那麼這也許是最好的選擇。

或者,如果您想按照您當前的方式手動啓動驗證,則由您決定如何處理導致驗證失敗的對象。

例如,您可以拋出一個異常來觸發當前事務的回滾(如果您使用Spring事務管理),以便您所做的更改不會保存到數據庫中。

如果你不想回滾事務,您可以從會議通過,以防止從節約無效狀態調用Session.evict()刪除實體:

Set<ConstraintViolation<Merchant>> violations= validator.validate(o); 
if (!violations.isEmpty()) myDao.doNotUpdate(o); 

public void doNotUpdate(MyObject o) { 
    sf.getCurrentSession().evict(o); 
} 
+0

感謝您的建議。我意識到會話驅逐和回滾功能。我想在春季控制器中自動檢查休眠以及手動,因爲我想通知最終用戶無效輸入。 – braincell 2012-08-09 07:57:01