gpt4 book ai didi

java - Spring HibernateDaoSupport 保持相同的 session ?

转载 作者:行者123 更新时间:2023-11-29 06:23:14 48 4
gpt4 key购买 nike

在我正在开发的独立应用程序(单线程命令行工具)中,我使用 Spring + Hibernate。它有 DAO 和服务层,对于 DAO,我使用 HibernateDAOSupport。域模型中的集合是延迟加载的。

由于延迟加载我需要保持 session 打开,我在应用程序开始时使用以下方法打开 session :

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

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

SessionFactoryUtils.processDeferredClose(tmpl.getSessionFactory());

但是在执行过程中,我得到了错误:

Exception in thread "main" org.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a collection with two open sessions; nested exception is org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions Caused by: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410) at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43) at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101) at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61) at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55) at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223) at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)

如何解决这个问题?

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

注意:在我的 DAO 中,我只使用过类似的方法;

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;
}
});

最佳答案

注意你的 DAO 中的 getHibernateTemplate().getSessionFactory().openSession(),你可能最终会打开 2 个 session ,因为你最近切换到这个架构,我从你的其他人那里知道上一个问题。

提示:请改用 getSession()。这SpringSource Forum's thread可能会有帮助。

关于java - Spring HibernateDaoSupport 保持相同的 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2152735/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com