我将Hibernate JPA用于我的Web应用程序,并将Apache Tomcat用于我的Web服务器。我的问题是,在更新我的实体obj之后,我调用另一个函数来获取实体列表。在该实体列表中,我看到旧对象而不是更新的对象。
我签入数据库并且记录已经更新。 但是EntityManager正在返回旧对象。
这是我的persistence.xml:
<?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="Default" transaction-type="RESOURCE_LOCAL">
<description>
Persistence unit for the Envers tutorial of the Hibernate Getting Started Guide
</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jar-file>D:\Projects\JPATempJars\com.mbc.common.jar</jar-file>
<jar-file>D:\Projects\JPATempJars\com.mbc.hr.jar</jar-file>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="datanucleus.storeManagerType" value="true" />
<property name="hibernate.bytecode.use_reflection_optimizer" value="true" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/hr" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123123" />
</properties>
</persistence-unit>
</persistence>
&#13;
这是我将对象更新为数据库的简单代码...
public void updateObj(Customer obj) throws Exception {
EntityManager em = getEntityManager();
try {
em.getTransaction().begin();
entityManager.merge(obj);
commitTransaction();
} catch (Exception e) {
em.getTransaction().rollback();
throw e;
} finally {
em.close();
}
}
&#13;
以下是从数据库获取对象列表的功能......
public ObjDataList getObjList(CriteriaParams cri) throws Exception {
EntityManager em = getEntityManager();
try {
String l_cri = " where c.column1 like '%" + cri.getKeyword() + "%' or c.column2 like '%" + cri.getKeyword() + "%'";
String l_searchJPQL = "select c from Customer c" + l_cri;
List < Customer > l_entityList = em.createQuery(l_searchJPQL, Role.class)
.setFirstResult(cri.getIndex())
.setMaxResults(cri.getSize())
.getResultList();
ObjDataList l_dataList = new ObjDataList();
l_dataList.setEntityList(l_entityList);
if (cri.getIndex() == 0) {
String l_countQuery = "select count(c.column1) from Customer c" + l_cri;
l_dataList.setTotalRecord(em.createQuery(l_countQuery, Long.class).getSingleResult());
}
return l_dataList;
} catch (Exception e) {
throw e;
} finally {
em.close();
}
}
&#13;
由于
答案 0 :(得分:0)
如果要绕过缓存并从数据库中读取,可以将缓存模式设置为刷新。
刷新还将使用其新发现更新缓存。
见这里: http://docs.oracle.com/javaee/6/tutorial/doc/gkjjj.html
答案 1 :(得分:0)
这听起来更像是第一级缓存的效果。检查创建列表的部分是否实际上获得了一个新的EntityManager,并且没有重用旧的,包括(陈旧的)第一级缓存。