powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibbernate, проблема с connection
4 сообщений из 4, страница 1 из 1
Hibbernate, проблема с connection
    #38626593
LinuxAwake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, пишу приложения на сервлетах (tomcat), не могу разобраться с connections.

Имеется 9 DAO объектов, для доступа к каждой из таблиц БД (все реализуют один интерфейс). Работаю с ними по одной схеме: при первом обращении создается интсанс DAO класса, при последующих (вплоть до завершения работы программы) возвращается этот инстанс, т.е. за все время работы не более одного DAO инстанса на таблицу (это важно).

Вот код типичного DAO класса:
Код: sql
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
public class QuestionsDAO implements DAOInterface {
    private Session session = HibernateUtil.getSessionFactory().openSession();

    @Override
    public void addObj(Object obj) throws SQLException {
        try {
            session.beginTransaction();
            session.save(obj);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.err.println(e.getMessage() + "\nОшибка при QuestionsDAO::addObj(Object obj)");
        } 
    }

    @Override
    public void updateObj(Object obj) throws SQLException {
        try {
            session.beginTransaction();
            session.update(obj);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.err.println(e.getMessage() + "\nОшибка при QuestionsDAO::updateObj(Object obj)");
        } 
    }


    @Override
    public Questions getObjById(Long obj_id) throws SQLException {
        Questions qst = null;
        try {
            qst = (Questions) session.load(Questions.class, obj_id);
        } catch (Exception e) {
            System.err.println(e.getMessage() + "\nОшибка при QuestionsDAO::getObjById");
        }
        return qst;
    }

    @Override
    public Collection getAllObj() throws SQLException {
        List qsts = new ArrayList<Questions>();
        try {
            qsts = session.createCriteria(Questions.class).list();
        } catch (Exception e) {
            System.err.println(e.getMessage() + "\nОшибка при  QuestionsDAO::getAllObj()");
        } 
        return qsts;
    }

    @Override
    public void deleteObj(Object obj) throws SQLException {
        try {
            session.beginTransaction();
            session.delete(obj);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.err.println(e.getMessage() + "\nОшибка при QuestionsDAO::deleteObj(Object obj)");
        }  
    }
}


Проблема в том, что не могу разобраться как раздавать коннекты, за время жизни этих классов. Пробовал делать один коннект для всех DAO, а при каждом обращении создавать и закрывать транзакцию -- не потокобезопасно, и hibernate ругался nested transactions not supported. Пробовал каждый раз, для обращения создавать connection, а после его закрывать -- тогда проблема с LAZY.
Как в коде выше, программа в принципе работает, но иногда ругается на Illegal attempt to associate a collection with two open sessions
Ошибка при QuestionsDAO::updateObj(Object obj),что вполне очевидно.
Прошу объяснить логику работы с connection, ибо я не понимаю как ими оперировать. В документации, примеров с долгоживущими коннектами. Благодарю за понимание.
...
Рейтинг: 0 / 0
Hibbernate, проблема с connection
    #38627619
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не увидел в примере DAO ничего связанного с Connection.
...
Рейтинг: 0 / 0
Hibbernate, проблема с connection
    #38628535
Psolao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я решал эту проблему тем, что создавал Сессию в каждой форме, и в передавал ее в методы DAO.
...
Рейтинг: 0 / 0
Hibbernate, проблема с connection
    #38628752
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LinuxAwake,
в учебниках полно примеров, но открывать отдельную сессию для каждой таблицы - такого точно нигде не посоветуют. Я уж боюсь спрашивать насчет уникальности DAO (и открытых внутри них сессий) относительно потоков
автор за все время работы не более одного DAO инстанса на таблицу (это важно).
Вот несколько наводящих вопросов:
- кто обеспечивает коннект (контейнер/приложение)
- конфигурация хибернейт (указаны ли какие-нибудь фабрики)
- в чем цель длинных сессий (и есть ли понимание, что сессия != коннект)
- стоит ли самостоятельно управлять транзкациями, может, начать с чего-то готового (jee, spring и т.п.)
Может, и удастся помочь, если будут ответы. Пока что напрашивается единственный совет - читать учебник.
Или использовать хибернейт кодогенератор - он сделатет 99% всей работы
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibbernate, проблема с connection
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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