В автономном приложении (инструмент для однопоточной командной строки), который я разрабатываю, я использую 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;
}
});