2015-03-28 3 views
0

Я использую Hibernate JPA для своего веб-приложения, и я использую Apache Tomcat для своего веб-сервера. Моя проблема заключается в том, что после обновления моего объекта obj я вызываю другую функцию, чтобы получить список сущностей. В этом списке объектов я вижу старый объект вместо обновленного.Отключение кеша второго уровня JPA не работает

Я зарегистрирую базу данных, и запись уже обновлена. Но 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>

Вот мой простой код для обновления объекта в базу данных ...

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(); 
 
    } 
 
}

Следующая функция для получения списка объектов из базы данных ...

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(); 
 
    } 
 
}

Благодаря

+0

Подробнее о том, как реализована реализация commitTransaction() 'и' getEntityManager() ', поможет лучше понять. –

+0

--getEntityManager entityManager = emFactory.crearteEntityManager(); --commitTransaction() entityManager.getTransaction(). Commit(); –

ответ

0

Если вы хотите обойти кэш и из базы данных, вы можете установить режим кэширования для обновления.

Обновление также обновит кэш новыми результатами.

Смотрите здесь: http://docs.oracle.com/javaee/6/tutorial/doc/gkjjj.html

0

Это больше походит на эффект первого кэша уровня. Убедитесь, что часть, создающая список, фактически получает новый EntityManager и не использует старый, который включает (устаревший) кеш первого уровня.

Смежные вопросы