2017-05-14 6 views
3

レガシーコードに問題が発生しました。 「ユーザ名」フィールドの検証セットは、その長さを検証し、それが含まれていることを確認すること、あります少なくとも1つの文字:保存(挿入)時のHibernate検証

@Column(name = "username") 
@Size(min = 4, max = 40) 
@Pattern(regexp = "^.*[a-zA-Z]+.*$") 
private String username; 

私たちが持っている問題は、いくつかの既存のレガシーデータは、これらの検証に適合し、かつIないということです新しく作成されたユーザーにも適用されながら、これらの検証を従来のデータ(古いユーザー)に対して無視する方法を見つけようとしています。

私は(そう値が実際の変更のみで検証されます)setUsername(...)メソッドに検証を動かす考えていたが、これは例外原因:私も実体がdynamicUpdate=trueに設定されていることを確認しました

javax.validation.ValidationException: Annotated methods must follow the JavaBeans naming convention. setUsername() does not. 

をただし、変更が発生していなくても、Hibernateはすべてのプロパティを検証しているので、これは役に立ちません。

これらの検証が更新中に既存のエンティティで実行されないようにするにはどうすればよいですか?
修正プログラムを同じエンティティの他のプロパティ検証に影響させたくないため、休止状態の構成を変更できません。

答えて

4

2日間の研究の後、私はこの作業を行う方法を見つけました。
明らかに、INSERTでのみ検証される検証を指定することはそれほど難しくありません。必要な変更は、これらの検証を特定の検証グループに設定し、INSERT/pre-persistイベント中にこのグループを検証することだけです。

まず最初に、というインターフェイスを作成して、プレスタンド中にのみ検証されるグループとして使用します。

よりも、私はusername現場検証にグループを追加しました:

@Column(name = "username") 
@Size(min = 4, max = 40, groups = {InsertOnlyValidations.class}) 
@Pattern(regexp = "^.*[a-zA-Z]+.*$", groups = {InsertOnlyValidations.class}) 
private String username; 

これはデフォルト・グループの一部としてこれらの検証を使用しない休止状態に指示します。さて、私は挿入時にこれらの検証ルールを検証するためにhibernateに指示する必要がありました。それを行うには
方法はpre-persistイベント中に検証されるグループを示す一方で、私は、プロパティjavax.persistence.validation.group.pre-persistを渡すために必要な、非常に簡単です:

javax.persistence.validation.group.pre-persist=javax.validation.groups.Default,platform.persistence.InsertOnlyValidations 

これはpre-persistイベント中にすべてのデフォルトの検証をその休止状態に指示しますInsertOnlyValidationsグループに含まれるすべての検証に加えて、検証されます(javax.validation.groups.Default)。

関連する問題