2015-07-28 2 views
0

Это программа, которую я пишу в спящем режиме, чтобы обновить три поля в таблице emp в базе данных с именем java3 с использованием новой темы. Однако после обновления он не отображает правильную запись. Вместо этого он извлекает данные из кеша. Пожалуйста, порекомендуйте. session.refresh() не загружает объект из базы данных.Обновленный объект не отображается

package mypack; 

import org.hibernate.*; 

public class Refresher { 

    public static void main(String[] args) { 
     System.out.println("Main Thread Started..."); 
     Session session = MyFactory.getSession(); 
     System.out.println("Loading entity with id 1..."); 
     Emp e = (Emp) session.get(Emp.class, 1); 
     System.out.println(e.getName() + "\t" + e.getJob() + "\t" 
       + e.getSalary()); 
     System.out.println("Starting a new Thread..."); 
     Thread th = new Thread() { 
      public void run() { 
       System.out.println("New Thread Started..."); 
       System.out.println("Modifying entity with id 1..."); 
       Session session = MyFactory.getSession(); 
       Emp e = (Emp) session.get(Emp.class, 1); 
       Transaction t = session.beginTransaction(); 
       e.setName("Kalpana Sharma"); 
       e.setJob("Yoga Instructor"); 
       e.setSalary(10000); 
       t.commit(); 
       session.close(); 
       System.out.println("Entity updated, new thread completed..."); 
      } 
     }; 
     th.start(); 
     System.out.println("Suspending main thread for 1 second..."); 
     try { 
      Thread.sleep(10000); 
     } catch (Exception ex) { 
     } 
     System.out.println("Main Thread resumed..."); 
     System.out.println("Refreshing the Entity..."); 
     //session.flush(); 
     //session.evict(e); 
     session.refresh(e); 
     System.out.println("Refreshed state of the entity..."); 
     System.out.println(e.getName() + "\t" + e.getJob() + "\t" 
       + e.getSalary()); 
     session.close(); 
     System.out.println("Main Thread Completed."); 
    } 
} 

Выход программы:

Loading entity with id 1... 
Hibernate: select emp0_.EmpId as EmpId1_0_0_, emp0_.name as name2_0_0_, emp0_.Designation as Designat3_0_0_, emp0_.salary as salary4_0_0_ from Emp emp0_ where emp0_.EmpId=? 
Anoop Sharma Software Engineer 35000 
Starting a new Thread... 
Suspending main thread for 1 second... 
New Thread Started... 
Modifying entity with id 1... 
Hibernate: select emp0_.EmpId as EmpId1_0_0_, emp0_.name as name2_0_0_, emp0_.Designation as Designat3_0_0_, emp0_.salary as salary4_0_0_ from Emp emp0_ where emp0_.EmpId=? 
Hibernate: update Emp set name=?, Designation=?, salary=? where EmpId=? 
Entity updated, new thread completed... 
Main Thread resumed... 
Refreshing the Entity... 
Hibernate: select emp0_.EmpId as EmpId1_0_0_, emp0_.name as name2_0_0_, emp0_.Designation as Designat3_0_0_, emp0_.salary as salary4_0_0_ from Emp emp0_ where emp0_.EmpId=? 
Refreshed state of the entity... 
Anoop Sharma Software Engineer 35000 
Main Thread Completed. 
+1

В 'run' метод, вызовите' session.beginTransaction() '' Перед session.get() 'и попробуйте. – Amogh

ответ

1

Попробуйте изменить последовательность beginTransaction и get методов,

... 
public void run() { 
System.out.println("New Thread Started..."); 
       System.out.println("Modifying entity with id 1..."); 
       Session session = MyFactory.getSession(); 
       Transaction t = session.beginTransaction(); //first begin the transaction 
       Emp e = (Emp) session.get(Emp.class, 1);     
       e.setName("Kalpana Sharma"); 
       e.setJob("Yoga Instructor"); 
       e.setSalary(10000); 
       t.commit(); 
       session.close(); 
       System.out.println("Entity updated, new thread completed..."); 
      } 
... 
+0

Я изменил код, чтобы начать транзакцию до session.get(), однако ничего не изменилось. Выход аналогичен указанному выше. Он не извлекает обновленный объект из базы данных. –

+0

Я пробовал все возможное, чтобы отобразить обновленный объект из базы данных, однако он не отображает обновленный объект из базы данных. Ну, есть ли проблемы с настройками MySql в phpmyadin? –