java - JPA 查询不返回列表中的更新结果

标签 java tomcat jpa eclipselink guice

我在 tomcat 中运行的 webapp 有一个问题,我有一个抽象的 DAO 类,它有一个名为 all() 的方法,它从数据库或 JPA 缓存中返回所有实体。它似乎在初始调用中正确返回实体,但后续调用不反射(reflect)从单独的 UI 调用发生的更新,这些调用将使用实体管理器 find 方法从列表中查找特定实体,更新相关字段并提交。当我稍后通过相同的 all() 方法查看该列表时,我仍然看到原始值。如果我在日志中进行另一次更新,我可以看到值从正确值(不是原始值)变为更新后的值,并且日志显示这些更新每次都正确发生。

我正在使用 guice 进行注入(inject)。我玩过日志记录,可以看到在整个请求中使用的实体管理器上的相同哈希码,但每个请求都不同。我玩过以下似乎也没有帮助的 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 已在引用它的地方嵌入了实体列表。

所以我看到每次都返回嵌入列表,这不是我更新的实际实体。我的实体现在使用正确的连接表而不是嵌入式对象,一切都按预期运行。

关于java - JPA 查询不返回列表中的更新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940628/

相关文章:

java - MySQLNonTransientConnectionException : Client does not support authentication protocol requested by server; consider upgrading MySQL client

sql - 自动生成时找出主键

java - 使用 JPA 实体管理器时,我可能会从 Hibernate Session 中错过什么,反之亦然?

java - 什么是NullPointerException,我该如何解决?

java - 对 java if else 性能感到困惑

java - 组件更改大小后文本消失

java - Tomcat 7 + JNI : UnsatisfiedLinkError: cannot open shared object file: No such file or directory

java - 古巴平台的应用洞察

java - jpa查询两个日期之间

Java广播: throw BindException