Java JPA:@OneToMany字段上的自定义约束

Java JPA:@OneToMany字段上的自定义约束,java,jpa,Java,Jpa,我有以下情况: @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; } 如果调用entityManager.pers

我有以下情况:

@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;
}

如果调用
entityManager.persist(foo)
,将验证约束。如果我调用
entityManager.persist(bar)
,它不是,即使该条是新添加到它的
Foo
集合中的。

问题是,当你试图持久化
bar
时,你不会自动持久化它的
Foo
。您必须在
@ManyToOne
注释中明确指定要级联持久化操作,或者必须手动持久化
foo

@ManyToOne(optional = false, cascade = CascadeType.PERSIST)
Foo foo;

首先,
mappedBy
需要一个字段名(字符串)而不是一个类,这可能是一个输入错误。它是固定的。这是对这个问题的重新思考,部分是出于记忆。我不明白。您的自定义注释是什么样子的?应该如何处理它?这是一个JSR-303/Hibernate验证器吗?它是一个javax.persistence验证器,我相信它是从Hibernate派生的,是的,JPA实现是Hibernate。仍然不调用验证,我也不知道为什么。可能是因为在数据库级别上,
Foo
?外键列位于
Bar
的表中,这是修改
Foo
的Bar集合时唯一会更改的内容。这仅适用于persist,如果您希望传播所有操作(例如合并、删除),则必须使用
CascadeType.all
。是的,但在我的小测试中,它甚至不适用于persist。不过,整个系统相当混乱,可能是完全其他原因阻止了这一点。无论如何,谢谢你。
@ManyToOne(optional = false, cascade = CascadeType.PERSIST)
Foo foo;