Spring HibernateDaoSupport сохранить тот же сеанс? - PullRequest
1 голос
/ 28 января 2010

В автономном приложении (инструмент для однопоточной командной строки), который я разрабатываю, я использую Spring + Hibernate.Он имеет уровни DAO и Service, а для DAO я использую HibernateDAOSupport.Коллекции в доменной модели загружаются с отложенной загрузкой.

Поскольку для отложенной загрузки мне нужно держать сеанс открытым, я открываю сессию при запуске приложения, используя:

HibernateTemplate tmpl;     
SessionFactoryUtils.initDeferredClose(tmpl.getSessionFactory());

//do file reads,parse CSV , persist objects (normally takes along time)
//
//Finally

SessionFactoryUtils.processDeferredClose(tmpl.getSessionFactory());

Но во времяПри выполнении я получаю сообщение об ошибке:

Исключение в потоке "main" org.springframework.orm.hibernate3.HibernateSystemException: недопустимая попытка связать коллекцию с двумя открытыми сеансами;вложенное исключение: org.hibernate.HibernateException: недопустимая попытка связать коллекцию с двумя открытыми сеансами. Причина: org.hibernate.HibernateException: недопустимая попытка связать коллекцию с двумя открытыми сессиями в org.hibernate.collection.AbstractPersistentCollection.setCurrentSession (AbstractPersistentCollection.java: 410) в org.hibernate.event.def.OnUpdateVisitor.processCollection (OnUpdateVisitor.java:43) в org.hibernate.event.def.AbstractVisitor.processValue (AbstractVisitor.java:101) в org.hiberdef.AbstractVisitor.processValue (AbstractVisitor.java:61) в org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues ​​(AbstractVisitor.java:55) в org.hibernate.event.def.AbstractVisitor.process (AbstractVisitor.12)в org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate (DefaultSaveOrUpdateEventListener.java:293) в org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDaveOventLvent3.SessionImpl.java:564) в org.hibernate.impl.SessionImpl.update (SessionImpl.java:552)

Как это исправить?

в org.hibernate.impl.SessionImpl.update (SessionImpl.java:544) в org.springframework.orm.hibernate3.HibernateTemplate $ 14.doInHibernate (HibernateTemplate.java:657) в org.springframework.orm.hibernate3.HibernateTemplate.ex372) в org.springframework.orm.hibernate3.HibernateTemplate.update (HibernateTemplate.java:654) в org.springframework.orm.hibernate3.HibernateTemplate.update (HibernateTemplate.java:650) в com.bigg.mondabare.hibernate.CommonDAOImpl.updateFamily (CommonDAOImpl.java:40) в com.bigg.nihonbare.common.service.impl.CommonServiceImpl.updateFamily (CommonServiceImpl.java:55) в com.bigg.nihonbare.util.flow.DynaRowHibernateUpdateHandler.handleRow (DynaRowHibernateUpdateHandler.java:72)

Примечание. В моих приложениях есть только I:как;

return (Long) this.getHibernateTemplate().save(family);

return (Family) this.getHibernateTemplate().execute(
                new HibernateCallback() {
                    public Object doInHibernate(Session session) {
                        Criteria criteria = session
                                .createCriteria(Family.class);
                        criteria.add(Expression.eq("familyId", familyId));
                        if (criteria.list().size() > 0) {
                            return criteria.list().get(0);
                        }
                        return null;
                    }
});

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Следите за getHibernateTemplate().getSessionFactory().openSession() в вашем DAO, возможно, вы заканчиваете тем, что открыли 2 сессии, так как вы недавно переключились на эту архитектуру, я знаю это из вашего предыдущего вопроса.

Подсказка: используйте getSession() вместо. Эта ветка форума SpringSource может быть полезна.

0 голосов
/ 17 ноября 2013

Существует много сеансов, связанных с каждым потоком в отдельности. Разделяемые переменные, но sessionfactory is , session создается контейнером Spring, если вы вставляете sessionfactory в DAO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...