删除JPA实体中的集合元素

时间:2018-10-11 12:56:18

标签: java jpa eclipselink

很长一段时间以来,我回到JPA上,我忘了最多。我有这种情况:

@Entity
@Table(name = "tablea")
public class TableA implements Serializable {
  ...
  @OneToMany(mappedBy = "taba", CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name = "id")
  List<TableB> tableb;
}

@Entity
@Table(name = "tableb")
public class TableB implements Serializable {
  ...
  @ManyToOne
  @JoinColumn(name = "id_tablea")
  TableA taba;

  @OneToOne
  @JoinColumn(name = "id_tablec")
  TableC tabc;
}

@Entity
@Table(name = "tablec")
public class TableC implements Serializable {
  ...
}

如您所见,TableB是一个关联表,我使用它来保持TableATableC之间的引用以及更多信息。就我添加或修改封装在TableB实例中的TableA对象而言,实体管理器按我的期望合并了该对象,数据库也随之更新。假设我有一个TableA对象,它在其TableB属性中封装了3个tableb对象。我删除了tableb中的一个元素,然后将TableA对象移动(序列化/反序列化)到实体管理器以执行entitymanager.merge(tableainstance),但是当我查看数据库时, 3 TableB条记录仍然存在。我没想到会找到它们,怎么了?我正在使用JPA 2.0eclipselink 2.5.0

1 个答案:

答案 0 :(得分:0)

  1. 由于TableB在OneToMany关系的拥有侧,因此请从TableB中删除对TableA的引用。
    tableBInstance.taba=null;

  2. 合并后清除缓存。
    entitymanager.getEntityManagerFactory().getCache().evictAll();