簡體   English   中英

JPA查詢未返回列表中的更新結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM