我有以下实体关系: SIDEA:
@Entity
@Table(name = "SideA")
public class SideA {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@CascadeOnDelete
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sideA", cascade=CascadeType.ALL)
private List<ABAssociation> association = new ArrayList<ABAssociation>();
}
B面:
@Entity
@Table(name = "SideB")
public class SideB {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@CascadeOnDelete
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sideB", cascade=CascadeType.ALL)
private List<ABAssociation> association = new ArrayList<ABAssociation>();
}
ABAssociation:
@Entity
@Table(name = "ABAssociation")
public class ABAssociation {
@EmbeddedId
private ABAssociationPK pk = new ABAssociationPK();
@ManyToOne(cascade=CascadeType.MERGE)
@MapsId("aId")
private SideA sideA;
@ManyToOne(cascade=CascadeType.MERGE)
@MapsId("bId")
private SideB sideB;
}
ABAssociationPK:
@Embeddable
public class ABAssociationPK implements java.io.Serializable{
private long aId;
private long bId;
}
我的问题是,当我删除一方时,数据库删除ABAssociation中的行,但仍保留在缓存中。
测试代码如下:
SideA a = new SideA();
SideB b = new SideB();
entitymanager.persist(a);
entitymanager.persist(b);
ABAssociation ab = new ABAssociation()
ab.setSideA(a);
ab.setSideB(b);
entitymanager.persist(ab);
a.getABAssociationList().add(ab);
b.getABAssociationList().add(ab);
a = entitymanager.merge(a);
b = entitymanager.merge(b);
entitymanager.delete(a);
由于删除了“a”,因此也应删除“a”和“b”之间的关系。 但当我检查“b.getABAssociationList()。size()”它仍然存在时,即使DB中的ABAssociation表中没有行。
这与共享缓存问题有关吗?
答案 0 :(得分:2)
在JPA中,您必须维护对象的关系。
如果删除对象,则必须先删除对它的所有引用。
答案 1 :(得分:2)
答案 2 :(得分:0)
您可以使用evict()
强制更新您的列表,如下所示:
getEntityManager().getEntityManagerFactory().getCache().evict(ABAssociation.class);