我有以下课程:

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/

10-09 18:29