Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с Hibernate transaction.commit 
V
    Опции темы
STIM
Дата 15.12.2013, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 12.2.2012

Репутация: нет
Всего: нет



Я использую Hibernate 4.2.4 и PostgreSQL 9.2. Проблемы с транзакциями. Сущность "Students" замаплена как многие-к-одному с сущностью "Groups" через аннотации. Когда я запускаю следующий кусок кода:
Код

StudentDAOImpl year = new StudentDAOImpl();
List<Students> stud = null;
List<Students> stud1 = null;
 
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");}


Я получаю следующий неправильный результат:
Код

Bill Murrey
  Ivan Ivanov
  List is empty


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

session.getTransaction().commit();


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

@Override
public List<beans.Students> getStudentsFromGroup(Integer id)
        throws SQLException {
    Session session = null;
    List<Students>  students = null;
    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 класс
Код

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("Сессия успешно закрыта! ");
 }


Это сообщение отредактировал(а) STIM - 15.12.2013, 06:35
PM MAIL   Вверх
Samotnik
Дата 15.12.2013, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



зачем этот блок?
Код

for (Students a : students) {
                Hibernate.initialize(a.getGroups());
                Hibernate.initialize(a.getTypeEducation());
 }

0.Открыл транзакцию
1.Выполнил запрос
2.Коммит транзакции
3. профит
PM MAIL   Вверх
STIM
Дата 15.12.2013, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 12.2.2012

Репутация: нет
Всего: нет



Чтобы избавиться от ленивой инициализации. С коммитом транзакции беда, если его выполнить, то после этого ни один запрос с транзакциями не выполняется. Что делать?
PM MAIL   Вверх
Samotnik
Дата 15.12.2013, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



Цитата(STIM @  15.12.2013,  15:16 Найти цитируемый пост)
после этого ни один запрос с транзакциями не выполняется

ошибка? какая?
PM MAIL   Вверх
STIM
Дата 15.12.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 12.2.2012

Репутация: нет
Всего: нет



В том то и дело что никакой ошибки. 
Как я уже в начале писал, выполняя этот код:

Код

StudentDAOImpl year = new StudentDAOImpl();
List<Students> stud = null;
List<Students> stud1 = null;
 
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");}


Я получаю следующий неправильный результат:

Код

  Bill Murrey
  Ivan Ivanov
  List is empty


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

  Bill Murrey
  Ivan Ivanov
  Bill Murrey
  Ivan Ivanov


В чем проблема?
PM MAIL   Вверх
Samotnik
Дата 15.12.2013, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



STIM, я предположу:
ты делаешь 
year.getStudentsFromGroup(7)
 в котором есть 
session = HibernateUtil.currentSession();
В котором сессия не открывается в случае, если она есть. Видимо, первый раз ты выгребаешь данные из сессии, а второй раз их там больше нет. Вообще метод currentSession() странный, обычно, перед каждой транзакцией нужно заново открывать сессию
PM MAIL   Вверх
STIM
Дата 15.12.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 12.2.2012

Репутация: нет
Всего: нет



Samotnik, спасибо большое! Действительно, там крылась ошибка, я неправильно управлял сессиями.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.