次のシナリオがあります。
@Entity public class Foo {
@Id private Long id;
@OneToMany(mappedBy = "foo")
@MyCustomConstraint
private Set<Bar> bars;
}
@Entity public class Bar {
// ...
@ManyToOne(optional = false)
Foo foo;
}
新しい を作成し、を呼び出しBarて既存の に追加するコードを自動生成しました (つまり、変更できません) 。がのコレクションにも追加されていることを確認します。次に、自動生成されたコードが を呼び出します。この時点で、カスタム制約バリデーターを実行する必要があります (新しく追加されたものはそれに違反する可能性があります) が、そうではありません。Foobar.setFoo(foo)setFoobarfoopersist(bar)foo.barsbar
私の質問:
- これは仕様によるものですか、それとも何か間違っていますか?
- 機能させるにはどうすればよいですか?
編集:
カスタム制約に関する詳細情報 - 質問には特に関係ないと思いますが。
これは単なるjavax.validationカスタム制約です。
@javax.annotation.Constraint(validatedBy = MyCustomConstraintValidator.class)
@AllTheOtherAnnotationStuff
public @interface MyCustomAnnotation {
}
public class MyCustomConstraintValidator implements ConstraintValidator<MyCustomConstraint, Set /*<Bar>*/ .class> {
void initialize(MyCustomConstraint a) {}
boolean isValid(Set /*<Bar>*/ s, ConstraintValidatorContext ctx) { ... }
}
を呼び出すentityManager.persist(foo)と、制約が検証されます。を呼び出すと、バーがのコレクションentityManager.persist(bar)に新しく追加されたにもかかわらず、そうではありません。Foo