我有以下情形:JPA:上@OneToMany字段的自定義約束
@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
的收藏。
首先'mappedBy'期待字段名(String)而不是類,這可能是一個錯字。 –
它是固定的。這是部分來自內存的問題的再現。 –
我不明白。你的自定義註釋是怎樣的?應該怎樣處理? –