使用JPA获取旧数据

And*_*dré 6 java jpa eclipselink

即使我禁用缓存,我也会使用JPA获取旧数据.我想是因为资源配置为RESOURCE_LOCAL,但我不确定.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="AppPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.myentities.User</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/mydatabase"/>
            <property name="javax.persistence.jdbc.password" value="*****"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="user1"/>
            <property name="eclipselink.logging.level" value="FINEST"/>
        </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

我的代码获取有关用户的旧信息:

public List<User> findAll(App app) {       
        getEntityManager().getTransaction().begin();        
        Query q = getEntityManager().createQuery("SELECT t1 FROM User t1 WHERE t1.app.idApp=:idApp");
        q.setParameter("idApp", app.getIdApp());
        getEntityManager().flush();
        getEntityManager().getTransaction().commit();
        List resultList = q.getResultList();        
        return resultList;
    }
Run Code Online (Sandbox Code Playgroud)

我的实体:

@Entity
@Table(name = "user")
@Cache (
     type=CacheType.NONE
     )
public class User implements Serializable {

// some attributtes

}
Run Code Online (Sandbox Code Playgroud)

有人知道发生了什么事吗?

更新1

开始,冲洗提交方法只是起到绝望!我知道这不是必需的.

我忘了说一些重要的事情:我做的测试是直接在数据库控制台上添加用户记录,然后尝试通过我的webapp看到它,而不显示新用户.这是我提到的"旧数据",它只显示"老用户".

我已经尝试将它放在persistence.xml上,我没有看到结果有任何不同:

<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>
Run Code Online (Sandbox Code Playgroud)

其他的东西......

Chr*_*ris 16

已经发布了一些建议,例如确保共享缓存已关闭,以及管理反向引用以使缓存一致.这些是针对可能发生的特定情况,但是您没有提供足够的信息来说明实际发生的情况.

另一个特定的,但似乎可能基于你的getEntityManager()用法,如果你重用EntityManager实例而不清除它.EntityManager保存对所有托管实体的引用,因为EM需要在后续查询中返回相同的实例并查找维护标识的调用.

如果尚未执行此操作,则需要清除EntityManager或在某些点获取新的EntityManager以释放内存和托管实体.