我有以下课程:
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。
答案 0 :(得分:1)
JPA要求所有关系都是Id(外键引用主键)。 因此,您需要将C中的@ManyToOne添加到B. 或者,确保B的Id是A的外键(在@OneToOne上将@Id从B添加到A并删除A的其他@Id)。 如果B是A的子类而不是OneToOne,那么这也可以。
如果您使用的是EclipseLink,则可以为关系定义更复杂的条件。您需要使用DescriptorCustomizer和OneToManyMapping API来定义OneToMany的外键。
答案 1 :(得分:0)
我认为你可以从A扩展B.
<击> 如果这不适合你,也许你可以添加一个瞬态属性来引用A的id,
@Transient
Integer getId1() {
return a.getId();
}
并使用id1
而不是B的主键加入C.
击>
编辑:这不起作用。