-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 回答