JPA:单向OneToMany问题

时间:2011-03-27 17:53:02

标签: java jpa

我有以下课程:

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。

2 个答案:

答案 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.

编辑:这不起作用。