Java jpa地图归;“一”;一边

Java jpa地图归;“一”;一边,java,jpa,bidirectional-relation,Java,Jpa,Bidirectional Relation,我有一个树状的数据结构,带有某种复合模式。对于抽象类元素,有一个CompositeElement和一个SingleElement。看起来是这样的: @Entity @DiscriminatorValue("Composite") public class CompositeElement extends Element { @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinTable(name="Sub_El

我有一个树状的数据结构,带有某种复合模式。对于抽象类元素,有一个CompositeElement和一个SingleElement。看起来是这样的:

@Entity
@DiscriminatorValue("Composite")
public class CompositeElement extends Element {

  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
  @JoinTable(name="Sub_Elements")
  @MapKeyColumn(name="xxx")
  protected Map<Integer, Element> subs;

  ...
}
但是@ManyToOne注释不允许使用“mappedBy”属性

从域视图中,父对象拥有数据结构中的子对象。而不是相反。急切获取和级联规则也强调了这一点

如果关系的所有权在子端,那么child.setParent(p)就不会真正起作用,因为这里我缺少映射的键


是否有任何方法可以将关系的所有权保留在父关系的一侧,但仍使其具有双向性?

请查看如何将
@JoinColumn
注释添加到您的
@ManyToOne

注释


通常情况下,
mappedby
会以另一种方式工作,@OneToMany将由@ManyToOne

映射。看起来不可能以我想要的方式工作

我把它改了,让这段关系归孩子所有。我在元素类中添加了一个属性“childIndex”。@MapKey引用了此属性

public class CompositeElement extends Element {

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="parent")
    @MapKey(name="childIndex")
    protected Map<Integer, Element> subs;
这个解决方案可行,但我不喜欢。我不喜欢child元素知道它的“childIndex”。在对父对象中的子对象重新排序时,需要修改每个子对象。我希望保留一个单独的数据库表来表示关系和索引列


我想另一种选择是将关系建模为实体本身。

链接不起作用,mappedBy只起相反的作用,这一事实就是我在问题中提出的。我不知道如何设置JoinColumn来解决我的问题。@JoinColumn标识元素的列,该列是CompositeElement的外键。我想你没有注意到我的“一”面上没有标准集合,只有一个映射。我知道我可以和拥有这种关系的“许多”方建立一对一的双向关系。我知道我可以选择带有@JoinColumn的数据库列。但是,如果“多”方拥有关系,我如何设置映射条目的键?您已经使用@MapKeyColumn。您还需要什么?不管逻辑域模型是否有一方“拥有”关系,在数据库中,多方拥有外键,因此它需要在JPA实现中排序拥有关系。你应该仍然可以随心所欲地进行急切而懒惰的取货。很明显,你并没有告诉我们所有的故事。对孩子重新排序的整个想法似乎与地图的使用不一致。请解释你的意思。还有一个@JoinTable注释,你可以研究它,它可能让你做你想做的事情。为什么重新排序与map的使用不一致?假设您有一个包含不同议程项目的会议议程。然后你注意到你需要交换其中的两个。我的观点是:当你交换议程上的各个项目的位置时,它们不会改变。你的观点?如果你看第一个问题,你会发现我在那里使用了@JoinTable。当关系由多方所有时,就不可能在JoinTable中包含键列。
public class CompositeElement extends Element {

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="parent")
    @MapKey(name="childIndex")
    protected Map<Integer, Element> subs;
public abstract class Element {

    protected Integer childIndex;

    @ManyToOne(fetch=FetchType.LAZY)
    protected CompositeElement parent;