Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с Hibernate transaction.commit / 8 сообщений из 8, страница 1 из 1
15.12.2013, 07:23:51
    #38501250
Metalhead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
Я использую Hibernate 4.2.4 и PostgreSQL 9.2. Проблемы с транзакциями. Сущность "Students" замаплена как многие-к-одному с сущностью "Groups" через аннотации. Когда я запускаю следующий кусок кода:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
StudentDAOImpl year = new StudentDAOImpl();
List<Students> stud = Collections.synchronizedList(new ArrayList<Students>());
List<Students> stud1 = Collections.synchronizedList(new ArrayList<Students>());
 
stud = year.getStudentsFromGroup(7);
stud1 = year.getStudentsFromGroup(7);
for (Students cat : stud) {
    System.out.println(cat.getName()+cat.getSurname());
    }
if( stud1.isEmpty()){ System.out.println("List is empty");}



Я получаю следующий неправильный результат:
Код: java
1.
2.
3.
  Bill Murrey
  Ivan Ivanov
  List is empty



Если я закомментирую это:

Код: java
1.
session.getTransaction().commit();



Я получу правильный результат.Почему так? я же должен закоммитить транзакцию?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@Override
public List<beans.Students> getStudentsFromGroup(Integer id)
        throws SQLException {
    Session session = null;
    List<Students>  students = Collections.synchronizedList(new ArrayList<Students>());
    try {
           session = HibernateUtil.currentSession();
           session.beginTransaction();
           students = session.createQuery ("from Students s where s.groups.groupid = :var1").setParameter("var1", id).list();   
           for (Students a : students) {
                Hibernate.initialize(a.getGroups());
                Hibernate.initialize(a.getTypeEducation());
            }
           session.getTransaction().commit();
         } catch (Exception e) {
             log.info("Проблемы с сессией! " + e.getMessage());
         } finally {
           if (session != null && session.isOpen()) {
               HibernateUtil.closeSession();
           }
         }
         return students;
}



Мой HibernateUtil класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class HibernateUtil {
 private static final SessionFactory sessionFactory;
 @SuppressWarnings("rawtypes")
private static final ThreadLocal session = new ThreadLocal();
 
    static {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
                     configuration.getProperties()).buildServiceRegistry();
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
 
 @SuppressWarnings("unchecked")
public static Session currentSession() throws HibernateException {
        Session s = (Session) session.get();
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
 }
 
 @SuppressWarnings("unchecked")
public static void closeSession() throws HibernateException {
        Session s = (Session) session.get();
        session.set(null);
        if (s != null) {
            s.close();
        }
        System.out.println("Сессия успешно закрыта! ");
 }
...
Рейтинг: 0 / 0
16.12.2013, 13:24:23
    #38502068
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
Почему результат не верный?
...
Рейтинг: 0 / 0
16.12.2013, 13:27:11
    #38502077
Metalhead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
Должен получить это.
Код: java
1.
2.
3.
4.
  Bill Murrey
  Ivan Ivanov
  Bill Murrey
  Ivan Ivanov



Ведь вызываю один и тот же метод, с одним и тем же входным параметром. Если я закомментирую коммит, то выводится правильно. код Java

В чем проблема?
...
Рейтинг: 0 / 0
16.12.2013, 13:54:27
    #38502116
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
Так в первом цикле сессию закрыли. Таогда уж и ThreadLocal следует обнулить, чтобы во 2 цикле новая сессия создалась.
...
Рейтинг: 0 / 0
16.12.2013, 13:58:12
    #38502126
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
А ThreadLocal вообще зачем тут? Пошаговую отладку пробовали? Что во втором случае вообще происходит в вашем DAO смотрели?
...
Рейтинг: 0 / 0
16.12.2013, 14:19:37
    #38502167
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
ivanraТак в первом цикле сессию закрыли. Таогда уж и ThreadLocal следует обнулить, чтобы во 2 цикле новая сессия создалась.
Не заметил - переменная на самом деле обнуляется (session.set(null);)
Ну тогда следует уточнить - кто управляет транзакциями? Возможно, контейнер? Какие при этом сообщения в логе?
...
Рейтинг: 0 / 0
16.12.2013, 14:23:20
    #38502178
Metalhead
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
Незнаю в чем причина. Я изменил класс HibernateUtil на этот:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class HibernateUtil {
	 private static final SessionFactory sessionFactory;

	    static {
	        try {
	        	Configuration configuration = new Configuration();
	        	configuration.configure();
	        	ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
	                     configuration.getProperties()).buildServiceRegistry();
	        	// Create the SessionFactory from hibernate.cfg.xml
	            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	        } catch (Throwable ex) {
	            System.err.println("Initial SessionFactory creation failed." + ex);
	            throw new ExceptionInInitializerError(ex);
	        }
	    }

	    public static SessionFactory getSessionFactory() {
	        return sessionFactory;
	      }
}


И ДАО методы поменял:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public List<Students> getStudentsFromGroup(Integer id) {
		Session session = null;
		 List<Students> students = null;
	    try {
	    	session = HibernateUtil.getSessionFactory().openSession();
		       session.beginTransaction();
		       students = session.createQuery ("from Students s where s.groups.groupid = :var1").setParameter("var1", id).list();	
		       for (Students a : students) {
		            Hibernate.initialize(a.getGroups());
		            Hibernate.initialize(a.getTypeEducation());
		        }
		       session.getTransaction().commit();
		     } catch (Exception e) {
		    	 log.info("Проблемы с сессией! " + e.getMessage());
		     } finally {
		       if (session != null && session.isOpen()) {
		    	   session.close();
		       }
		     }
		     return students;
	}


Все стало нормально работать. Спасибо за помощь!
...
Рейтинг: 0 / 0
16.12.2013, 14:24:01
    #38502181
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с Hibernate transaction.commit
Metalhead,

Вы всё пишете в System.out, а ошибку, в log. Может поэтому вы и не видите ошибку, которая в логе?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с Hibernate transaction.commit / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]