eclipselink 2 OneToMany有一个关联表如何从一侧删除

时间:2012-05-29 18:53:38

标签: jpa eclipselink

我有以下实体关系: 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表中没有行。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您可以使用evict()强制更新您的列表,如下所示:

getEntityManager().getEntityManagerFactory().getCache().evict(ABAssociation.class);