[英]JPA query not returning updated results in list
我在tomcat中運行的Web應用程序遇到問題,其中我有一個抽象的DAO類,該類具有名為all()的方法,該方法從數據庫或JPA緩存返回所有實體。 似乎正確地在初始調用中返回了實體,但是后續調用並沒有反映出來自單獨的UI調用的更新,這些更新將使用實體管理器的find方法從列表中查找特定實體,更新相關字段並提交。 以后,當我通過相同的all()方法查看該列表時,仍然看到原始值。 如果我在日志中進行了另一個更新,則可以看到該值從正確值(不是原始值)更改為更新后的值,並且日志顯示每次更新均正確進行。
我正在用Guice注射劑。 我玩過日志記錄,可以看到在整個請求中使用的實體管理器上的哈希碼相同,但對於每個請求卻不同。 我玩了以下persistance.xml文件,該文件似乎也無濟於事...
<property name="eclipselink.cache.shared.default" value="false" />
<shared-cache-mode>NONE</shared-cache-mode>
我看不到為什么我的all()無法返回更新的結果,我還嘗試添加代碼以在列表中找到我要更新的特定實體,然后通過調用以下代碼來替換它...
entity = em.find(Class.class, id)
這似乎可以解決該特定實體上的問題,因此我的查詢似乎在重用舊的。
這是我的DAO課程的摘錄
private final Provider<EntityManager> emP;
protected EntityManager em(boolean useTransaction) throws DaoException {
return useTransaction ? begin() : emP.get();
}
public List<T> all() throws DaoException {
EntityManager em = em(false);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(eClass);
Root<T> from = cq.from(eClass);
return em.createQuery(cq.select(from)).getResultList();
}
public T save(T t) throws DaoException {
return save(t, em(true));
}
protected T save(T t, EntityManager em) throws DaoException {
if (Objects.isNull(t)) {
throw new DaoException("can't save null object: " + getDaoClass(), new NullPointerException());
}
T saved;
if (t.getId() > 0) {
saved = em.merge(t);
} else {
em.persist(t);
saved = t;
}
autoCommit();
return saved;
}
protected void autoCommit() throws DaoException {
if (autoCommit) {
commit();
}
}
public void commit() throws DaoException {
EntityManager em = emP.get();
if (!em.getTransaction().isActive()) {
throw new DaoException("transaction isn't active, unable to commit");
}
try {
em.getTransaction().commit();
} catch (IllegalStateException e) {
throw new DaoException("transaction not active", e);
} catch (RollbackException e) {
throw new DaoException("commit rolled back", e);
}
}
因此,我想知道是否有人對為什么會發生這種情況有任何見解,或者對我還能嘗試檢查的內容有任何建議?
因此,我找到了造成該問題的原因。 引用列表時,我在實體中使用了ElementCollection批注。 我刪除了注釋,並將其替換為JoinTable和OneToMany注釋,並且一切正常。
我遇到的問題是,該實體可以很好地存儲在數據庫中,並且我按預期更新了該實體,但是JPA嵌入了引用它的實體列表。
因此,我看到每次返回的嵌入列表都不是我更新過的實際實體。 我的實體現在正在使用正確的聯接表而不是嵌入式對象,並且一切都按預期進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.