我正在使用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);
}
我怎样才能让事情发挥作用?如何使用其所有关联实体刷新实体?感谢。
答案 0 :(得分:0)
它也可能是一个AJAX缓存问题。原因是如果你使用javascript for AJAX,你最终可能会遇到缓存问题。只需检查一下..如果您认为问题出在JPA缓存中,那么使用flush和refresh处理实体管理器将解决问题
答案 1 :(得分:0)
我不确定它是否会起作用,但请尝试一下 在你的代码中,如果它的后端问题。
em.merge(ask);
ask.getId();
或
em.merge(ask);
ask.getId();
ask.getCollection1ofAsk().size();
ask.getCollection2OfAsk().size();
.....
答案 2 :(得分:0)
在em.refresh(ask)之前添加em.flush()后,代码按照我的意图运行。它获取了与实体相关的列表。谁有人解释为什么?非常感谢
答案 3 :(得分:0)
如果我理解你的问题可能会对你有所帮助 - 请在返回前注意em.refresh电话。这确保即使您只保存相关记录的ID,也会刷新所有OneToOne和OneToMany连接。
public T create(T entity) {
em.persist(entity);
em.flush();
em.refresh(entity); // this could be important
return entity;
}