您可以只从JPA实体管理器缓存中清除特定的实体类型吗

9gm1akwq  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(147)

在原始的JPA规范中(因此不是像Hibernate或EclipseLink这样的特定实现),是否有一个选项可以为特定类型的实体调用em.clear(),而不为其他类型的实体调用em.clear()
我问这个问题的原因是,我有一个创建和存储成千上万个实体的过程;但是,每个实体都有一个子实体,它是数据库中大约30条记录中的一条,所以我希望能够调用类似em.clear(MainEntity.class)这样的函数,这意味着我不会清除被重用的子实体该高速缓存,也不会积累成千上万条不需要的记录。
下面是我目前正在做的一个简单的例子:

List<Child> children = (List<Child>)em.createQuery("Select c from " + Child.entityName + " c").getResultList();

for (int i=0;i<700000;i++)
{
    Parent p = createParent(i, getRandomChild(children));
    em.persist(p);
    
    if (i%1000 == 0)
    {
         em.flush(); // push to db
         em.clear(); // remove old items from cache - but unfortunately removes children too
        // as I've cleared the cache, I need to repopulate this to reattach the children again
        children = (List<Child>)em.createQuery("Select c from " + Child.entityName + " c").getResultList();
    }
}
vcirk6k6

vcirk6k61#

您可以使用

void detach(java.lang.Object entity)

就像这样

em.detach(p);

从持久性上下文中仅删除父级。

相关问题