2017-03-20 13 views
1

HQLを使用して簡単なHibernateプログラムを作成しました。 私はそれにSELECTとUPDATEの両方を含んでいました。レコードを更新して表示しようとすると、古いレコードが返されます。 私はUPDATE後にトランザクションをコミットしますが、それでも古いレコードをフェッチします。 SELECTの新しいセッションを追加すると、更新された新しいレコードがフェッチされます。最新のレコードを取得するたびに新しいセッションを作成する必要がありますか?古いレコードを取得する

AppMain.class: 
    package com.HQL.Main; 

    import java.util.List; 

    import org.hibernate.Query; 
    import org.hibernate.Session; 
    import org.hibernate.SessionFactory; 
    import org.hibernate.Transaction; 
    import org.hibernate.cfg.Configuration; 

    import com.HQL.Model.Employee; 

    public class AppMain { 

     public static void main(String[] args) { 
      SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
      Session session = sessionFactory.openSession(); 
      Transaction tx = session.beginTransaction(); 
      Query query = null; 
      List<Employee> list1 = null; 

      query = session.createQuery("from Employee"); 
      list1 = query.list(); 
      for (Employee emp : list1) { 
       System.out.println("\nEmployee ID:\t" + emp.getId() + "\nEmployee name:\t" + emp.getName() 
         + "\nEmployee Age:\t" + emp.getAge() + "\nEmployee Salary:" + emp.getSalary()); 
      } 

      query = session.createQuery("update Employee set age=:empname where id=:eid"); 
      query.setParameter("empname",36); 
      query.setParameter("eid",3); 
      int result = query.executeUpdate(); 
      System.out.println("Result:"+result); 
      tx.commit(); 

      session = sessionFactory.openSession(); 
      Query query1 = session.createQuery("from Employee"); 
      list1 = query1.list(); 
      for (Employee emp : list1) { 
       System.out.println("\nEmployee ID:\t" + emp.getId() + "\nEmployee name:\t" + emp.getName() 
         + "\nEmployee Age:\t" + emp.getAge() + "\nEmployee Salary:" + emp.getSalary()); 
      }  
      //tx.commit(); 
      session.close(); 
      sessionFactory.close(); 
     } 
    } 

答えて

0

セッション軍がデータベース

クリアを完全に明確なセッションとセッションのメモリー内の状態を同期させるために休止状態フラッシングsession.flush();session.clear();

を使用してみてください。ロードされたすべてのオブジェクトを削除し、すべての保留中の操作を取り消し、すべてのオブジェクトのキャッシュをクリアします。トライフラッシュを更新した後

とこれは私がセッションが含まれているhttps://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html

+0

詳細情報を動作するはずSession.refresh(Object)

てみてください。また

 int result = query.executeUpdate(); System.out.println("Result:"+result); tx.commit(); session.flush(); session.clear(); 

または

のように取得します。私のコードにstush()をフラッシュするそれは表示中に古いレコードを取るでしょう。 –

+0

フラッシュした後、別のセッションを開始するのではなく、同じセッションを使用してみてください –

+0

はいセッションを使用しました。 –

関連する問題