0

我正在使用 JPA (EclipseLink 2.5) 进行持久性。我的网络应用程序包含 AJAX 页面更新。保存帖子后,无需刷新浏览器即可显示发布的内容。该帖子具有使用 OneToMany 关系与之关联的标签。这些标签也应该在保存后显示。但是,由于启用了缓存,我无法获取标签。

这是我的代码:

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

我怎样才能让事情发挥作用?如何刷新实体及其所有关联实体?谢谢。

4

4 回答 4

0

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

public T create(T entity) {
  em.persist(entity);
  em.flush();
  em.refresh(entity); // this could be important
  return entity;
}
于 2013-07-27T05:36:50.080 回答
0

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

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

或者

 em.merge(ask);
 ask.getId();
 ask.getCollection1ofAsk().size();
 ask.getCollection2OfAsk().size();
.....
于 2013-07-26T12:43:31.227 回答
0

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

于 2013-07-26T16:49:55.370 回答
0

这也可能是 AJAX 缓存问题。原因是如果您将 javascript 用于 AJAX,您最终可能会遇到缓存问题。只需检查它.. 如果您认为问题出在 JPA 缓存上,使用刷新和刷新解决实体管理器将解决问题

于 2013-07-26T09:06:31.370 回答