powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с Hibernate transaction.commit
8 сообщений из 8, страница 1 из 1
Проблемы с Hibernate transaction.commit
    #38501250
Metalhead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я использую 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
Проблемы с Hibernate transaction.commit
    #38502068
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему результат не верный?
...
Рейтинг: 0 / 0
Проблемы с Hibernate transaction.commit
    #38502077
Metalhead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Должен получить это.
Код: java
1.
2.
3.
4.
  Bill Murrey
  Ivan Ivanov
  Bill Murrey
  Ivan Ivanov



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

В чем проблема?
...
Рейтинг: 0 / 0
Проблемы с Hibernate transaction.commit
    #38502116
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так в первом цикле сессию закрыли. Таогда уж и ThreadLocal следует обнулить, чтобы во 2 цикле новая сессия создалась.
...
Рейтинг: 0 / 0
Проблемы с Hibernate transaction.commit
    #38502126
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ThreadLocal вообще зачем тут? Пошаговую отладку пробовали? Что во втором случае вообще происходит в вашем DAO смотрели?
...
Рейтинг: 0 / 0
Проблемы с Hibernate transaction.commit
    #38502167
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraТак в первом цикле сессию закрыли. Таогда уж и ThreadLocal следует обнулить, чтобы во 2 цикле новая сессия создалась.
Не заметил - переменная на самом деле обнуляется (session.set(null);)
Ну тогда следует уточнить - кто управляет транзакциями? Возможно, контейнер? Какие при этом сообщения в логе?
...
Рейтинг: 0 / 0
Проблемы с Hibernate transaction.commit
    #38502178
Metalhead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Незнаю в чем причина. Я изменил класс 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
Проблемы с Hibernate transaction.commit
    #38502181
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Metalhead,

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


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