title: JPA createQuery and flush/clear
body: <p>The following code works,
  however if I remove the flush() and clear() calls,
  then the second call to showTable() does not show the updated name "joan", but "john".</p>
  
  <p>What is the proper way to achieve this, without calling flush() and clear()?</p>
  
  <pre><code>import java.util.List;
  
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import javax.persistence.Query;
  
  import org.junit.Test;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
  import org.springframework.test.context.transaction.TransactionConfiguration;
  import org.springframework.transaction.annotation.Propagation;
  import org.springframework.transaction.annotation.Transactional;
  
  import com.example.Customer;
  
  @ContextConfiguration(locations = {"classpath:spring/test/spring-test.xml"})
  @TransactionConfiguration(transactionManager = "txManager")
  public class Test extends AbstractTransactionalJUnit4SpringContextTests {
      private final Logger log = LoggerFactory.getLogger(getClass());
  
      @PersistenceContext
      private EntityManager entityManager;
  
      @Test
      @Transactional(propagation = Propagation.REQUIRES_NEW)
      public void test() throws Exception {
          Customer customer = new Customer();
          customer.setName("john");
  
          entityManager.persist(customer);
          entityManager.flush();
          entityManager.clear();
  
          showTable();
  
          final Query query = entityManager.createQuery("update Customer c set c.name='joan'");
          int updateCount = query.executeUpdate();
          log.debug("Update count: " + updateCount);
          entityManager.flush();
          entityManager.clear();
  
          showTable();
      }
  
      public void showTable() {
          final Query query = entityManager.createQuery("select c FROM Customer c");
          List&lt;Customer&gt; list = query.getResultList();
          for (Customer customer: list) {
              log.info("customer name: " + customer.getName());
          }
      }
  }
  </code></pre>