当前位置: 首页 > 知识库问答 >
问题:

持久化后如何刷新缓存?

慕容宏邈
2023-03-14

我使用JPA(Eclipse Link 2.5)进行持久性。我的Web应用程序包含AJAX页面更新。保存帖子时,发布的内容会在不刷新浏览器的情况下显示。该帖子具有使用OneTo多关系与之关联的标签。这些标签应该在保存后也会显示出来。但是,由于启用了缓存,我无法获取标签

这是我的代码:

   @TransactionAttribute(TransactionAttributeType.REQUIRED)
public Sqask save(AskTag tags) {
    try {
        Sqask ask = saveAsk(tags);
        return ask;
    } catch (Exception e) {
        context.setRollbackOnly();
        return null;
    }
}

public Sqask saveAsk(AskTag tags) {
        Sqask ask = new Sqask();
        ask.setCreator(tags.getAskedBy());
        em.persist(ask);
        em.flush();
        saveTags(tags, ask);
        return ask;
    }

public void saveTags(AskTag tags, Sqask ask) {
        if (!tags.getNask().isEmpty()) {
            NAsk nask = new NAsk();
            NAskPK naskPK = new NAskPK();
            naskPK.setAsk(ask.getId());
            naskPK.setNoun(tags.getNask());
            naskPK.setCreator(tags.getAskedBy().getGuid());
            nask.setNAskPK(naskPK);
            nask.setAsk(ask);
            nask.setCreator(tags.getAskedBy());
            em.persist(nask);
        }

        if (!tags.getVask().isEmpty()) {
            VAsk vask = new VAsk();
            VAskPK vaskPK = new VAskPK();
            vaskPK.setAsk(ask.getId());
            vaskPK.setVerb(tags.getVask());
            vaskPK.setCreator(tags.getAskedBy().getGuid());
            vask.setVAskPK(vaskPK);
            vask.setAsk(ask);
            vask.setCreator(tags.getAskedBy());
            em.persist(vask);
        }

        if (!tags.getForask().isEmpty()) {
            PAsk forask = new PAsk();
            PAskPK foraskPK = new PAskPK();
            foraskPK.setAsk(ask.getId());
            foraskPK.setPrep(tags.getForask());
            foraskPK.setCreator(tags.getAskedBy().getGuid());
            forask.setPAskPK(foraskPK);
            forask.setAsk(ask);
            forask.setCreator(tags.getAskedBy());
            em.persist(forask);
        }

        if (!tags.getAboutask().isEmpty()) {
            PAsk aboutask = new PAsk();
            PAskPK aboutaskPK = new PAskPK();
            aboutaskPK.setAsk(ask.getId());
            aboutaskPK.setPrep(tags.getAboutask());
            aboutaskPK.setCreator(tags.getAskedBy().getGuid());
            aboutask.setPAskPK(aboutaskPK);
            aboutask.setAsk(ask);
            aboutask.setCreator(tags.getAskedBy());
            em.persist(aboutask);
        }

        em.getEntityManagerFactory().getCache().evict(Sqask.class, ask.getId());
        em.merge(ask);
}

我怎样才能让事情运转起来?如何刷新一个实体及其所有关联的实体?谢了。

共有3个答案

上官斌
2023-03-14

在em.refresh(ask)之前添加em.flush()之后,代码按照我的预期工作。它获取了与实体ask相关的列表。有人能解释一下为什么吗?非常感谢

傅宏恺
2023-03-14

我不太确定它是否会工作,但请尝试在您的代码中,如果这是后端的问题。

em.merge(ask);
 ask.getId();

 em.merge(ask);
 ask.getId();
 ask.getCollection1ofAsk().size();
 ask.getCollection2OfAsk().size();
.....
邓仲卿
2023-03-14

如果我正确理解您的问题,这可能会帮助您-请在返回前注意em.refresh呼叫。这确保了刷新所有OneToOne和OneToMany连接,即使您只保存相关记录的ID。

public T create(T entity) {
  em.persist(entity);
  em.flush();
  em.refresh(entity); // this could be important
  return entity;
}
 类似资料:
  • 和RDD相似,DStreams也允许开发者持久化流数据到内存中。在DStream上使用persist()方法可以自动地持久化DStream中的RDD到内存中。如果DStream中的数据需要计算多次,这是非常有用的。像reduceByWindow和reduceByKeyAndWindow这种窗口操作、updateStateByKey这种基于状态的操作,持久化是默认的,不需要开发者调用persist(

  • 在Spring声明性事务管理中,当您试图持久化数据库中已经存在的某个实体时,您只能在Spring事务提交期间获得DataIntegrityViolationException。因此,此方法不起作用,此处不会捕获大括号中的异常: 仅在结束时: 我发现了几个解决方法: 不使用@事务 使用冲洗 调用服务时捕获异常 在持久化之前查找 现在我在考虑em.flush和em.find(在坚持之前)。哪种方法更好

  • 本文向大家介绍浅谈Webpack 持久化缓存实践,包括了浅谈Webpack 持久化缓存实践的使用技巧和注意事项,需要的朋友参考一下 前言 最近在看 webpack 如何做持久化缓存的内容,发现其中还是有一些坑点的,正好有时间就将它们整理总结一下,读完本文你大致能够明白: 什么是持久化缓存,为什么做持久化缓存? webpack 如何做持久化缓存? webpack 做缓存的一些注意点。 持久化缓存 首

  • Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重

  • 目标 能够运行集合,而无需在运行集合之前逐个完成每个调用的授权过程。 我所尝试/注意到的 > 在Postman中使用OAuth2授权助手时,我没有发现保存返回的刷新令牌的方法,因此在访问令牌到期时使用它来获取新的令牌。(我建议将此功能放在Postman Github问题中的助手中。) 我尝试在集合开始时创建几个步骤来复制助手,但无法通过需要用户交互来批准/拒绝的步骤(这是有道理的,因为否则会带来安

  • 在持久性方面,spark中的和有什么区别?