2

Spring MVC アプリで Hibernate Validator を使用しています。context.xml で構成しました

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

今ではコントローラーでそれを使用して、さまざまなオブジェクトを検証しています。一時的なオブジェクトについては問題ありませんが、永続的なオブジェクトについてはどうでしょうか。例:

私は1つをロードします:

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

このオブジェクトの検証が失敗した場合でも、Hibernate はそれを更新します!

with validate()のメソッドにアノテーションをつけてみましたValidator

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

ただし、検証が失敗したかどうかに関係なく更新されます。ただし、検証が失敗した場合に例外をスローしたくありません。

4

1 に答える 1

1

更新前に検証を自動的に実行するように Hibernate を構成できます。7.3 を参照してください。ORM 統合。検証が失敗した場合に特定のアクションを実行したくない場合は、おそらくこれが最良の選択です。

または、現在行っているように手動で検証を開始する場合は、検証の失敗の原因となったオブジェクトをどうするかを決定する必要があります。

たとえば、現在のトランザクションのロールバックをトリガーする例外をスローして (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);
}
于 2012-08-08T17:25:43.743 に答える