powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + Session
25 сообщений из 28, страница 1 из 2
Hibernate + Session
    #33460071
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После выполнения такого метода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public  Object update(Object entity)  throws  BusinessServiceException {
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();
         try  {
            session.update(entity);
            tx.commit();
        }  catch  (HibernateException ex) {
            tx.rollback();
             throw   new  BusinessServiceException(ex);
        }
         return  entity;
}

после
tx.commit() происходит закрытие сессии. (session.isOpen() = false) , хотя явно session.close() нигде не вызывается.
Как избавиться от этого ?
Есть необходимость вызывать такой метод в рамках одной сесии.
...
Рейтинг: 0 / 0
Hibernate + Session
    #33460633
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не замечал, чтобы в результате tx.commit(); закрывалась сессия... этого просто не может быть.

А кроме того, зачем надо использовать механизм двухфазной фиксации для того, чтобы обновить одну-единственную запись?... стрельба из пушки по воробьям.
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461160
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М.Голованов
... механизм двухфазной фиксации для того, чтобы обновить одну-единственную запись?...
Это как?
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461164
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.ГоловановЧто-то не замечал, чтобы в результате tx.commit(); закрывалась сессия... этого просто не может быть.

А кроме того, зачем надо использовать механизм двухфазной фиксации для того, чтобы обновить одну-единственную запись?... стрельба из пушки по воробьям.

Может и не должна - но у меня закрывается: делаю проверку в начале и конце метода так: session.isOpen(). В начале метода - true, в конце - false.

По поводу зачем вызывать 2 раза: к примеру я хочу обновлять в одной сессии разные сущности (метод, как видно принимает Object). Кроме того, есть аналогичные методы для удаления и сохранения. Но все было бы прекрасно, если б после камита транзыкции сессия не закрывалась.

Настройки хибернэйта стандартные. В чем может быть проблема?
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461463
Grinya_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какие транзакции используются? jdbc, jta, ...?
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461486
Grinya_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и что у тебя в методе HibernateUtil.currentSession() ?
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461504
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю - JDBC.
Приложение работает под JBoss.
hibernate-service.xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>

<server>

    <mbean code="org.jboss.hibernate.jmx.Hibernate" name="jboss.har:service=Hibernate">
        <attribute name="DatasourceName">java:/DS</attribute>
        <attribute name="Dialect">org.hibernate.dialect.PostgreSQLDialect</attribute>
        <attribute name="SessionFactoryName">java:/hibernate/SessionFactory</attribute>

        <attribute name="MaxFetchDepth"> 3 </attribute>
        <attribute name="JdbcBatchSize"> 5 </attribute>
        <attribute name="JdbcFetchSize"> 1000 </attribute>
        <attribute name="JdbcScrollableResultSetEnabled">false</attribute>
        <attribute name="GetGeneratedKeysEnabled">false</attribute>
        <attribute name="QueryCacheEnabled">true</attribute>
        <attribute name="CacheProviderClass">org.hibernate.cache.EhCacheProvider</attribute>
        <attribute name="ShowSqlEnabled">true</attribute>
	    <attribute name="Hbm2ddlAuto">update</attribute>
    </mbean>

</server>
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461520
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grinya_и что у тебя в методе HibernateUtil.currentSession() ?

Код: plaintext
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.
 public   class  HibernateUtil {
     private   static  Log log = LogFactory.getLog(HibernateUtil. class );
     private   static   final  SessionFactory sessionFactory;
     public   static   final  ThreadLocal session =  new  ThreadLocal();

     static  {
	 try  {
	     Context ctx =  new  InitialContext();
	      String jndiName = "java:/hibernate/SessionFactory";
	      sessionFactory = (SessionFactory)ctx.lookup(jndiName);
                }  catch  (Throwable ex) {
                     log.error("Initial SessionFactory creation failed.", ex);
                      throw   new  ExceptionInInitializerError(ex);
                }
    }


     public   static  Session currentSession()  throws  HibernateException {
       Session s = (Session) session.get();
         if  (s ==  null ) {
            s = sessionFactory.openSession();
            session.set(s);
        }
         return  s;
    }

     public   static   void  closeSession()  throws  HibernateException {
        Session s = (Session) session.get();
        session.set( null );
         if  (s !=  null ) s.close();
    }
}
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461822
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
давайте сюда полный код, при котором возникает такой эффект
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461846
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас Hibernate 3.1? А то очень похоже на его SessionFactory.getCurrentSession()... В часности он использует модель 1 транзакция - 1 сессия и обычно закрывает сессию (и jdbc соединение) после завершения транзакции. Кстати это очень не плохая стратегия и я бы советовал придерживаться именно ее...
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461899
Grinya_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверь
Код: plaintext
1.
session.isAutoCloseSessionEnabled()
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461966
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
60.
61.
62.
63.
 public   class  CommonDAO  implements  IPersister {

     public  Object create(Object entity)  throws  BusinessServiceException {
         return  saveOrUpdate(entity);
    }

     private  Object saveOrUpdate(Object entity)  throws  BusinessServiceException {
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();
         try  {
            session.saveOrUpdate(entity);
            tx.commit();
        }  catch  (HibernateException ex) {
            tx.rollback();
            ex.printStackTrace();
             throw   new  BusinessServiceException(ex);
        }
         return  entity;
    }

     public  Object update(Object entity)  throws  BusinessServiceException {
         return  saveOrUpdate(entity);
    }

     public  Object load( Long  id,  Class  c)  throws  BusinessServiceException {
        Object entity =  null ;
         try  {
             entity = (Object) HibernateUtil.currentSession().get(c, id);
        }  catch  (HibernateException ex) {
             ex.printStackTrace();
              throw   new  BusinessServiceException(ex);
        }
         return  entity;
    }

     public  List load( Class  c)  throws  BusinessServiceException {
        List objects;
         try  {
            objects = HibernateUtil.currentSession().createCriteria(c).list();
        }  catch  (HibernateException ex) {
            ex.printStackTrace();
             throw   new  BusinessServiceException(ex);
        }
         return  objects;
    }

     public   void  delete(Object entity)  throws  BusinessServiceException {
         Session session = HibernateUtil.currentSession();
         Transaction tx = session.beginTransaction();
          try  {
              session.delete(entity);
              tx.commit();
         }  catch  (HibernateException ex) {
             tx.rollback();
             ex.printStackTrace();
              throw   new  BusinessServiceException(ex);
         }
    }

     public   void  delete( Long  id,  Class  c)  throws  BusinessServiceException {
        Object entity = load(id, c);
        delete(entity);    
    }

У меня JBoss 4.0.2 и я использую хибернайт, интегрированный в него (3-я версия).
По поводу транзакций - сори - используется JTA JBoss-а. Все настройки - по дэфолту.

На счет 1 сессия - 1 транзакция: мне не совсем удобна данная стратегия. Я бы хотел 1 сессия - много транзакций.
...
Рейтинг: 0 / 0
Hibernate + Session
    #33461988
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grinya_Проверь
Код: plaintext
1.
session.isAutoCloseSessionEnabled()


нет такого метода.
есть тока:
isOpen()
isConnected()
isDirty()
...
Рейтинг: 0 / 0
Hibernate + Session
    #33462062
AndreySerj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще встречный вопрос:
Как в стратегии <1 сессия - 1 запрос> использовать ленивую(lazy) загрузку?
Например есть:
class Parent {
Set children;
...
}
Если в одном запросе загрузить Parent, а потом обратиться к его getChildren() - получим эксепшен - ведь сессия то закрыта.
...
Рейтинг: 0 / 0
Hibernate + Session
    #33462242
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreySerjЕще встречный вопрос:
Как в стратегии <1 сессия - 1 запрос> использовать ленивую(lazy) загрузку?
Например есть:
class Parent {
Set children;
...
}
Если в одном запросе загрузить Parent, а потом обратиться к его getChildren() - получим эксепшен - ведь сессия то закрыта.
Угу, интересный вопрос. Есть ли кто у кого подобное выходило? Мне когдато пришлось отказацца от лейзи, благо ситуация позволяла (маааленькая такая база с мааленьким количеством записей). Помницца в прошлом топике, где поднимался этот вопрос, на него так никто и не ответил :(
...
Рейтинг: 0 / 0
Hibernate + Session
    #33463456
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreySerjМожет и не должна - но у меня закрывается: делаю проверку в начале и конце метода так: session.isOpen(). В начале метода - true, в конце - false.

session.isOpen() == false в Hibernate 2.1.X вовсе не означает, что сессия на самом деле закрыта. Это означает лишь, что выполнен метод cleanup() (в вашем случае - в результате tx.commit() ). То есть вы можете спокойно продолжать работать в этой сессии.

В Hibernate 3.X session.isOpen() == false означает, что сессия на самом деле закрыта, отсоединена от JDBC контекста и так далее.
...
Рейтинг: 0 / 0
Hibernate + Session
    #33464564
Grinya_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreySerj
нет такого метода.
есть тока:
isOpen()
isConnected()
isDirty()
метода действительно нет в интерфейсе Session, но он есть в классе SessionImpl.
Если используется JTA, то тынц

Note that the sessions returned from this method are automatically configured with both the auto-flush and auto-close attributes set to true , meaning that the Session will be automatically flushed and closed as part of the lifecycle for the JTA transaction to which it is associated. Additionally, it will also be configured to aggressively release JDBC connections after each statement is executed. These settings are governed by the isAutoFlushEnabled(), isAutoCloseEnabled(), and getConnectionReleaseMode() methods; these are provided (along with the buildOrObtainSession() method) for easier subclassing for custom JTA-based session tracking logic (like maybe long-session semantics).
...
Рейтинг: 0 / 0
Hibernate + Session
    #33466399
Seon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jozic AndreySerjЕще встречный вопрос:
Как в стратегии <1 сессия - 1 запрос> использовать ленивую(lazy) загрузку?
Например есть:
class Parent {
Set children;
...
}
Если в одном запросе загрузить Parent, а потом обратиться к его getChildren() - получим эксепшен - ведь сессия то закрыта.
Угу, интересный вопрос. Есть ли кто у кого подобное выходило? Мне когдато пришлось отказацца от лейзи, благо ситуация позволяла (маааленькая такая база с мааленьким количеством записей). Помницца в прошлом топике, где поднимался этот вопрос, на него так никто и не ответил :(

Мона использовать Lightweight Classes http://hibernate.org/41.html для того чтоб
не загружать лишний мусор
...
Рейтинг: 0 / 0
Hibernate + Session
    #33467288
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeonМона использовать Lightweight Classes http://hibernate.org/41.html для того чтоб не загружать лишний мусор
Занятная фича, но, к сожалению, не вижу, чем она может помочь в данной ситуации :(
...
Рейтинг: 0 / 0
Hibernate + Session
    #33487547
Макарон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jozic AndreySerjЕще встречный вопрос:
Как в стратегии <1 сессия - 1 запрос> использовать ленивую(lazy) загрузку?
Например есть:
class Parent {
Set children;
...
}
Если в одном запросе загрузить Parent, а потом обратиться к его getChildren() - получим эксепшен - ведь сессия то закрыта.
Угу, интересный вопрос. Есть ли кто у кого подобное выходило? Мне когдато пришлось отказацца от лейзи, благо ситуация позволяла (маааленькая такая база с мааленьким количеством записей). Помницца в прошлом топике, где поднимался этот вопрос, на него так никто и не ответил :(

Доброго времени суток...
Народ, кто-нить проясните плиз... Как использовать???
...
Рейтинг: 0 / 0
Hibernate + Session
    #33487631
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, кто-нить проясните плиз... Как использовать???

Объясняю -
1. использовать lazy везде где можно. При этом нужно фечить все что нужно до комита и закрытия сессии... lazy fetching для отсоединенных объектов hibernate не поддерживает
2. где надо использовать FetchMode.JOIN для Criteria Queries и LEFT JOIN для HQL-запросов. Если уверен что такая стратегия нужно всегда можно указать ее в файле маппинга (но это редко)
3. правильно использовать second-level cache. В этом случае то что зафетчено не будет перечитываться из БД постоянно.

Верное использование всех 3х подходов - залог успеха в создание эффективных приложений на hibernate... L)
...
Рейтинг: 0 / 0
Hibernate + Session
    #33487783
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri1. использовать lazy везде где можно. При этом нужно фечить все что нужно до комита и закрытия сессии... lazy fetching для отсоединенных объектов hibernate не поддерживает
2. где надо использовать FetchMode.JOIN для Criteria Queries и LEFT JOIN для HQL-запросов. Если уверен что такая стратегия нужно всегда можно указать ее в файле маппинга (но это редко)
Помницца подымался подобный вопрос касательно вебсервиса, то есть ситуация когда не известно что именно понадобицца. То есть придецца фетчить все сразу. Тогда возникает вопрос: насколько эффективнее юзать лейзи + явный фетч при каждом запросе, по сравнению с отказом от лейзи? И есть ли разница вообще(в чем)?
Второй пункт, если я правильно понял, разъясняет как фетчить, то есть то, о чем говорилось в первом пункте. Поправьте, плиз, если не так.
...
Рейтинг: 0 / 0
Hibernate + Session
    #33549109
Макарон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, вопрос в следующем:
есть две таблицы - Customer и CustomerWebContact связь - один ко многим
все это дело замаппено, в маппинге, там где <set ... прописано lazy="true" (в одном месте получается)

Проблема 1:
делаю так:
String customer_id = "1";
Customer theCustomer = new Customer();
CustomerWebContact = new CustomerWebContact();
theCustomer = CustomerManager.getCustomer(customer_id);

Set result = theCustomer.getCustomerWebContactSet();
// до этого все ок, но на следующей строчке падает

System.out.println(result.size());

Пишет что сессия уже закрыта.

Проблема 2:
делаю так:
String customer_id = "1";
Customer theCustomer = new Customer();
CustomerWebContact = new CustomerWebContact();
theCustomer = CustomerManager.getCustomer(customer_id);
theCustomerWebContact.setCustomer(theCustomer);
List res = theCustomerWebContactManager.findByExample(theCustomerWebContact);

так вот лист res содержит ВСЕ записи из таблицы CustomerWebContact независимо от их customer_id...
//т.е. метод findByExample игнорирует foreign key при поиске??? т.к. если я делаю так:
theCustomer = CustomerManager.getCustomer(customer_id);
theCustomerWebContact.setCustomer(theCustomer);
theCustomerWebContact.setWebContactType("1");
List res = theCustomerWebContactManager.findByExample(theCustomerWebContact);
// То выбирается правильно ???

Заранее благодарю за помощь...
...
Рейтинг: 0 / 0
Hibernate + Session
    #33549449
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведите весь код приводящий к ошибке
...
Рейтинг: 0 / 0
Hibernate + Session
    #33549641
Макарон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это по findByExample

public class EditCustomerProfileAction extends ActionSupport {

public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
WebApplicationContext theContext = getWebApplicationContext();
CustomerManager theCustomerManager = (CustomerManager)theContext.getBean("customerManager");
CustomerWebContactManager theCustomerWebContactManager = (CustomerWebContactManager)theContext.getBean("customerWebContactManager");
HttpSession hs = request.getSession();
String customer_id = hs.getAttribute("customer_id").toString();

Customer theCustomer = new Customer();
theCustomer = theCustomerManager.getCustomer(customer_id);
CustomerWebContact theCustomerWebContact = new CustomerWebContact();
theCustomerWebContact.setCustomer(theCustomerManager.getCustomer(customer_id));

List result = theCustomerWebContactManager.findCustomerWebContactByExample(theCustomerWebContact); /// !!! ТУТ ЛАЖА LIST СОДЕРЖИТ ВСЕ(!!!) ЗАПИСИ
request.setAttribute("customer", theCustomer);
...
...
...
return mapping.findForward(ApplicationUtilities.SUCCESS);
}
}


CustomerWebContactManager - все замучено со Спрингом и всякими Дао... оч много приводить... главная суть в методе этом:

public class HibernateBasedCustomerWebContactDao extends HibernateDaoSupport implements
CustomerWebContactDao {

public CustomerWebContact getCustomerWebContact(Integer aCustomerWebContactId) {
return (CustomerWebContact) getHibernateTemplate().get(CustomerWebContact.class,
aCustomerWebContactId);
}

public List getAllCustomerWebContacts() {
return getHibernateTemplate().find("from CustomerWebContact");
}

public void saveCustomerWebContact(CustomerWebContact aCustomerWebContact) {
getHibernateTemplate().saveOrUpdate(aCustomerWebContact);
}

public void removeCustomerWebContact(Integer aCustomerWebContactId) {
Object theCustomerWebContact = getHibernateTemplate().load(CustomerWebContact.class, aCustomerWebContactId);
getHibernateTemplate().delete(theCustomerWebContact);
}

public List findCustomerWebContactByExample(CustomerWebContact aCustomerWebContact) {
return getHibernateTemplate().findByExample(aCustomerWebContact);
} /// вот ентот метод по идее должен производить поиск всех КустомерВебКонтактов с заданными полями (т.е. в моем случае с заданным объектом CUSTOMER , у которого customer_id задан) а он, редиска выдает ВСЕ записи


надеюсь объяснил? могу скинуть на мыло, но там все закручено оч сильно...

З.Ы. в таблице CUSTOMER_WEB_CONTACT поле customer_id - это fk для таблицы CUSTOMER...
}

ЕСЛИ ДЕЛАТЬ ТАК:


public class EditCustomerProfileAction extends ActionSupport {

public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
WebApplicationContext theContext = getWebApplicationContext();
CustomerManager theCustomerManager = (CustomerManager)theContext.getBean("customerManager");
CustomerWebContactManager theCustomerWebContactManager = (CustomerWebContactManager)theContext.getBean("customerWebContactManager");
HttpSession hs = request.getSession();
String customer_id = hs.getAttribute("customer_id").toString();

Customer theCustomer = new Customer();
theCustomer = theCustomerManager.getCustomer(customer_id);
CustomerWebContact theCustomerWebContact = new CustomerWebContact();

theCustomerWebContact.setNumName("1"); // Определять поле (НЕ FK) то следующее:
List result = theCustomerWebContactManager.findCustomerWebContactByExample(theCustomerWebContact);
request.setAttribute("customer", theCustomer); // работает КОРРЕКТНО(т.е. выбираются ТОЛЬКО ТЕ записи, у которых NUM_NAME=1)

...
...
...
return mapping.findForward(ApplicationUtilities.SUCCESS);
}
}
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate + Session
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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