0

我有以下实体关系: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>();
}

ABA协会:

@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;
}

ABA协会PK:

@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()”时它仍然存在,即使数据库中的 ABAssociation 表中没有行。

这与共享缓存问题有关吗?

4

3 回答 3

2

在 JPA 中,您必须维护对象的关系。

如果您删除一个对象,您必须首先删除对它的所有引用。

见, http ://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

于 2012-05-30T14:54:35.997 回答
2

有点,是的。当 ABAssociation 被删除时,您需要删除 B 对 ABAssociation 的引用,以维护数据库中的缓存。如果您无法在应用程序中执行此操作,您可以通过在 ABAssociation 上使用 preremove 事件来执行此操作。

于 2012-05-30T14:57:18.037 回答
0

您可以使用以下方式强制更新您的列表evict()

getEntityManager().getEntityManagerFactory().getCache().evict(ABAssociation.class);
于 2015-05-29T12:28:58.770 回答