JPA + CascadeType +缓存

时间:2014-02-12 13:16:39

标签: java caching jpa cascade relation

我有一些JPA缓存问题,方案如下:

我有两个A和B类,关系是ManyToMany,但后来我将ManyToMany拆分为两个OneToMany关系和新类

public class A{

    @OneToMany(cascade = CascadeType.ALL, mappedBy="a")
    private List<AB> ab;
}

public class B{

    @OneToMany(cascade = CascadeType.ALL, mappedBy="b")
    private List<AB> ab;
}


public class AB{

     @ManyToOne
     @JoinColumn(name = "A_id", referencedColumnName="id")
     private A a;

     @ManyToOne
     @JoinColumn(name = "B_id", referencedColumnName="id")
     private B b;

     ...other fields
}

我的问题是,当我删除A:我希望A和AB被删除,而B未触及db(如果我删除B则相同)。

这样可行,并且DB状态很好但是JPA和缓存存在问题。 当我删除A(和带有级联的AB)时,JPA缓存仍然在B实例中保存对它们的引用 - 这是不可取的。因此,当我查询B时,我将找到已删除的嵌套AB实例。

我试图在AB ManyToMany字段上添加级联,但它没有帮助。 如果我清除缓存:entityManager.getEntityManagerFactory()。getCache()。evictAll();一切正常,但这不是一个好的解决方案。

我将EntityManager与EJB3一起使用,并从javax.persistence级联。

我很感激答案。

1 个答案:

答案 0 :(得分:0)

您的问题与eclipselink 2 OneToMany with one association table how to delete from one side 类似。因此,在删除A(因此删除AB)之前,请删除B到AB的所有引用。