Frühjahr HibernateDaoSupport halten die gleiche Session?
In der standalone-Anwendung(single-threaded Kommandozeilen-tool), ich entwickle ,ich benutze Spring +Hibernate.
Es hat DAO und Service-Layern und für DAOs ich benutze HibernateDAOSupport.
Die Sammlungen im domain-Modell sind lazy-loading.
Da für lazy-loading ich brauche, um die Sitzung zu bekommen,öffne ich Sitzung beim start meiner Anwendung mit:
HibernateTemplate tmpl;
SessionFactoryUtils.initDeferredClose(tmpl.getSessionFactory());
//do file reads,parse CSV , persist objects (normally takes along time)
//
//Finally
SessionFactoryUtils.processDeferredClose(tmpl.getSessionFactory());
Aber bei der Ausführung erhalte ich die Fehlermeldung:
Exception in thread "main"
org.springframework.orm.hibernate3.HibernateSystemException:
Illegalen Versuch zu verbinden
Sammlung mit zwei offenen Sitzungen;
verschachtelte Ausnahme ist
org.hibernate.HibernateException:
Illegalen Versuch zu verbinden
Sammlung mit zwei offenen Sitzungen
Verursacht durch:
org.hibernate.HibernateException:
Illegalen Versuch zu verbinden
Sammlung mit zwei offenen sessions
org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
bei
org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
bei
org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
bei
org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
bei
org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
bei
org.hibernate.event.def.AbstractVisitor.Prozess(AbstractVisitor.java:123)
bei
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
bei
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
bei
org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
bei
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
bei
org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564)
bei
org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
Wie man dieses Problem beheben?
in
org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
bei
org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:657)
bei
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
bei
org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:654)
bei
org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:650)
bei
com.bigg.nihonbare.common.dao.hibernate.CommonDAOImpl.updateFamily(CommonDAOImpl.java:40)
bei
com.bigg.nihonbare.common.service.impl.CommonServiceImpl.updateFamily(CommonServiceImpl.java:55)
bei
com.bigg.nihonbare.util.flow.DynaRowHibernateUpdateHandler.handleRow(DynaRowHibernateUpdateHandler.java:72)
HINWEIS : In meinen DAOs ich nur haben Methoden wie;
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;
}
});
Du musst angemeldet sein, um einen Kommentar abzugeben.
Uhr für
getHibernateTemplate().getSessionFactory().openSession()
in Ihrem DAO, Sie könnte Ende-up Eröffnung 2 Sitzungen, da Sie in letzter Zeit eingeschaltet, um diese Architektur, ich weiß es von anderen vorherigen Frage.Hinweis: Verwenden Sie
getSession()
statt. Diese SpringSource Forum-thread hilfreich sein könnten.getHibernateTemplate().save(family)
verwenden, werden Sitzung.save() irgendwo auf der Straße, und die meisten wahrscheinlich öffnen Sie eine neue Sitzung. Was sagen Sie?Gibt es eine Menge zugeordnete Sitzung, um jeden thread separat .Sitzung nicht ein
Shared-Variablen aber sessionfactory ist,Sitzung erstellt durch spring-container wenn Sie injizieren sessionfactory in DAO.