Eclipselink 2.5.1-RC1 JPA三向多机:自动添加/删除连接表记录
我有3个实体:X、Y、Z。X由Y的集合组成,每个Y与一个Z相关联。(Y-Z)->X关联保存在一个名为YZ_2_X_映射的连接/链接表中,有三个引用作为复合主键:YId、ZId、XId 以下是X实体的代码: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
@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;