Eclipselink 2.5.1-RC1 JPA三向多机:自动添加/删除连接表记录

Eclipselink 2.5.1-RC1 JPA三向多机:自动添加/删除连接表记录,jpa,many-to-many,eclipselink,Jpa,Many To Many,Eclipselink,我有3个实体:X、Y、Z。X由Y的集合组成,每个Y与一个Z相关联。(Y-Z)->X关联保存在一个名为YZ_2_X_映射的连接/链接表中,有三个引用作为复合主键:YId、ZId、XId 以下是X实体的代码: @Entity public class X implements Serializable { // Properties //bi-directional many-to-one association to YZ_2_X_Map @OneToMany(cascade=C

我有3个实体:X、Y、Z。X由Y的集合组成,每个Y与一个Z相关联。(Y-Z)->X关联保存在一个名为YZ_2_X_映射的连接/链接表中,有三个引用作为复合主键:YId、ZId、XId

以下是X实体的代码:

@Entity
public class X implements Serializable {

  // Properties

  //bi-directional many-to-one association to YZ_2_X_Map 
  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="x")
  @JoinTable(name="YZ_2_X_Map",
    joinColumns=
      @JoinColumn(name="XId")
  )
  private List<YZ_2_X_Map> yZList;

  public void setYZList(List<YZ_2_X_Map> yZList) {
    this.yZList = yZList;
  }
}
我的期望是,每当我持久化X时,基于yZList中的条目,YZ_2_X_映射连接表中的记录都应该被插入/删除

使用上面的代码,向yzList添加新条目会按照我的期望在YZ_2_X_映射表中添加新记录

但是,从yzList中删除条目不会从YZ_2_X_映射表中删除相应的记录

我还尝试从类X的@OneToMany注释中删除mappedBy,并从类YZ_2_X_Map中删除X属性。在这种情况下,当从yzList中删除条目时,会删除相应的记录,向yzList中添加新条目并持久化X将生成INSERT into YZ_2_X_映射,但会引发重复条目异常


请告诉我如何根据yZList中的条目自动添加/删除YZ_2_X_映射表中的记录。

您为YZ_2_X_映射表创建了一个实体,但随后正在创建一个1:m映射到使用YZ_2_X_映射联接表的实体-实际上是一个联接表到联接表的联接表。mappedBy=“x”告诉映射要使用的外键包含在YZ_2_x_Map.x映射中。只有当联接表或联接列是关系的拥有方或是单向的时,才需要联接表或联接列

所需要的是:

  public class X implements Serializable {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="x")
    private List<YZ_2_X_Map> yZList;
    ...

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“x”)
@私有的
私人名单;

谢谢<代码>删除=true使所有操作都按预期进行。单向和双向方法都有效。在单向情况下,只有
JoinColumn
工作。但是,
JoinTable
抛出了MySQLIntegrityConstraintViol异常:键“PRIMARY”的重复条目“3-2-1”错误代码:1062
  public class X implements Serializable {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="x")
    private List<YZ_2_X_Map> yZList;
    ...
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval=true, mappedBy="x")
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="x")
@PrivateOwned
private List<YZ_2_X_Map> yZList;