我有以下情况:
@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
集合中的。