我有以下课程:
class A{
@OneToOne(cascade=CascadeType.ALL)
private B b;
}
class C{
@ManyToOne
private A a;
}
class B{
@OneToOne
private A a;
@MapKey(name = "name")
@OneToMany(cascade = CascadeType.ALL, ...)
@JoinColumn(...)
private Map<String C> cs;
}
如何在B.cs上指定映射以加入B.a == C.a?
这可能吗?还是我必须将属性C.a更改为C.b? (我宁愿保持原样,因为实体B只是一个助手类。)
我也尝试将B更改为@Embeddable,但可嵌入对象不支持Map。
最佳答案
JPA要求所有关系都应按ID(外键引用主键)进行。
因此,您需要从C向B添加一个@ManyToOne。
或者,确保B的ID是A的外键(将@OneToOne上的@Id从B添加到A并删除A的其他@Id)。
如果B是A的子类,而不是具有OneToOne,这也将起作用。
如果使用的是EclipseLink,则可以为关系定义更复杂的条件。您将需要使用DescriptorCustomizer和OneToManyMapping API定义OneToMany的外键。
关于java - JPA:单向OneToMany问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5451087/