0

我有一个类似树的数据结构,具有某种复合模式。对于抽象类 Element,有一个 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;

  ...
}

到目前为止,这种关系是单向的。它运作良好。但是现在出现了一个用例,我需要从子元素导航到父元素。所以我想做的是:

@Entity
@Inheritance
@DiscriminatorColumn("s_discriminator")
public class Element {

  @ManyToOne(mappedBy="subs", fetch=FetchType.LAZY)
  protected CompositeElement parent;
  ...
}

但是@ManyToOne 注解不允许“mappedBy”属性。

从域的角度来看,父对象拥有数据结构中的子对象。不是反过来。急切获取和级联规则也强调了这一点。

如果关系的所有权在子方,那么 child.setParent(p) 将不会真正起作用,因为这里我缺少地图的密钥。

有没有办法将关系的所有权保留在父级的一方,但仍然是双向的?

4

2 回答 2

0

查看为 @ManyToOne@JoinColumn注释向您的@ManyToOne和javadocs 添加注释。

通常情况下mappedby,@OneToMany 将由 @ManyToOne 映射的另一种方式工作

于 2015-06-10T03:18:00.293 回答
0

看起来不可能按照我想要的方式。

我改变了它,所以关系归孩子所有。我在 Element 类中添加了一个属性“childIndex”。此属性由@MapKey 引用。

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;

该解决方案有效,但我不喜欢它。我不喜欢子元素知道它的“childIndex”。当我对父对象中的子对象重新排序时,我需要修改每个子对象。我很想保留一个单独的数据库表来表示关系和索引列。

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

于 2015-06-12T19:38:57.727 回答