次のシナリオがあります。
@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
て既存の に追加するコードを自動生成しました (つまり、変更できません) 。がのコレクションにも追加されていることを確認します。次に、自動生成されたコードが を呼び出します。この時点で、カスタム制約バリデーターを実行する必要があります (新しく追加されたものはそれに違反する可能性があります) が、そうではありません。Foo
bar.setFoo(foo)
setFoo
bar
foo
persist(bar)
foo.bars
bar
私の質問:
- これは仕様によるものですか、それとも何か間違っていますか?
- 機能させるにはどうすればよいですか?
編集:
カスタム制約に関する詳細情報 - 質問には特に関係ないと思いますが。
これは単なる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