-3

次のシナリオがあります。

@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

私の質問:

  1. これは仕様によるものですか、それとも何か間違っていますか?
  2. 機能させるにはどうすればよいですか?

編集:

カスタム制約に関する詳細情報 - 質問には特に関係ないと思いますが。

これは単なる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

4

1 に答える 1

0

問題は、永続化しようとするとbar、自動的に永続化されないことですfoo@ManyToOne永続化操作をカスケードすることをアノテーションで明示的に指定するか、foo手動で永続化する必要があります。

@ManyToOne(optional = false, cascade = CascadeType.PERSIST)
Foo foo;
于 2013-05-28T12:06:29.720 に答える