Hibernate - 映射属于其他两个对象的对象(具有 2 个父对象的对象)

Ano*_*nym 5 java orm hibernate

我在映射以下内容时遇到了一些麻烦:

public class Operation {
  private Integer id;
  private String name;
  private List<Item> items = new ArrayList<Item>();
  //set/getters/hashcode/etc. omitted

  public void addItem(Item i,Operation end) {
     i.setOperationStart(this);
     i.setOperationEnd(end};
     items.add(i);
     end.getItems().add(i);
   }

public class Item {
  private Integer id;
  private String name;
  private Operation  operationStart;
  private Operation  operationEnd;
  //set/getters/hashcode/etc. omitted
}
Run Code Online (Sandbox Code Playgroud)

所以基本上一个操作有一堆项目,一个项目属于2个操作。此外,如果其中一项操作不存在,则项目存在也没有意义,即如果我删除其中一项操作,我还想从它存储的其他任何地方删除该项目。

有没有人有关于我如何映射上述类的指针,或者可以指出一些示例,显示如何映射具有 2 个父级的子对象?

Pas*_*ent 3

从面向对象的角度来看,所表示的内容看起来像和之间的两个 ManyToOne关联,其中一个是双向的。这可以这样映射:ItemOperation

@Entity
public class Item {
  @Id private Integer id;
  private String name;
  @ManyToOne
  private Operation  operationStart;
  @ManyToOne
  private Operation  operationEnd;

  //set/getters/hashcode/etc. omitted
}

@Entity
public class Operation {
  @Id private Integer id;
  private String name;

  @OneToMany(cascade = CascadeType.REMOVE, mappedBy="operationStart")
  private List<Item> items = new ArrayList<Item>();

  //set/getters/hashcode/etc. omitted
}
Run Code Online (Sandbox Code Playgroud)

这应该会导致[ITEM]表中有两个 FK 指向[OPERATION]。填充items集合将导致SELECT仅限于其中之一(ID上例中的启动操作)。

我不知道这种情况是否有意义,但在我看来,这是 Hibernate 可以处理的唯一情况。如果这不是您想要的,那么我认为您应该在侧面有两个集合Operation(您可以隐藏在友好的方法后面)。

无论您使用 hbm.xml 还是注释都没有任何区别。