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)
有人知道发生了什么事吗?
在开始,冲洗和提交方法只是起到绝望!我知道这不是必需的.
我忘了说一些重要的事情:我做的测试是直接在数据库控制台上添加用户记录,然后尝试通过我的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以释放内存和托管实体.
| 归档时间: |
|
| 查看次数: |
11794 次 |
| 最近记录: |