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;