使用Spring HibernateDaoSupport进行延迟加载?
问候我正在使用Spring + Hibernate开发一个非Web应用程序。 我的问题是HibernateDaoSupport如何处理延迟加载,因为在调用DAO之后,Session被关闭了。
看看下面的伪代码:
DAO就像:
CommonDao extends HibernateDaoSupport{ Family getFamilyById(String id); SubFamily getSubFamily(String familyid,String subfamilyid); }
域模型如下:
Family{ private List subfamiles; public List getSubFamiles(); } SubFamily{ private Family family; public Family getFamily(); }
在应用程序中,我从app-context获取DAO并希望执行以下操作。这可能与延迟加载有关,因为AFAIK在每个方法(getFamilyById(),getSubFamily())之后关闭会话。
CommonDAO dao=//get bean from application context; Family famA=dao.getFamilyById(familyid); // //Do some stuff List childrenA=fam.getSubFamiles(); SubFamily asubfamily=dao.getSubFamily(id,subfamilyid); // //Do some other stuff Family famB=asubfamily.getFamily();
我的问题是HibernateDaoSupport如何处理延迟加载,因为在调用DAO之后,Session被关闭了。
DAO不会为每个调用创建/关闭一个Session,它们不对此负责,这通常使用“ Open View in View ”模式(Spring为此提供filter或拦截器)来完成。 但这适用于网络应用。
在swing应用程序中,一种解决方案是使用长会话 。 您必须决定关闭会话以释放内存的明确定义的点。 对于小型应用程序,这通常很简单并且可以工作。 对于更大的(即真实应用程序),正确的解决方案是每帧/内部框架/对话使用一个会话。 管理起来比较难,但会扩大规模。
您可能想要阅读的一些主题:
- 富客户端应用程序中的hibernate LazyInitializationException
- Spring / Hibernate长会话支持还是最佳实践?
- 在swing客户端中保持hibernate会话打开? (这是恕我直言最有趣的,特别是#9)
- 以及Hibernate和Swing演示应用程序
如果您已经在使用Spring,则可以使用其Transaction-Declaration。 使用此function,您可以为特定方法声明事务。 这使Sessio保持开放状态以获得完整的tx。
声明事务切入点
现在你可以做这个懒惰,保持会话打开完整的方法。
public class SomeService() { public Family getFamily() { Family famA=dao.getFamilyById(familyid); //Do some stuff List childrenA=fam.getSubFamiles(); SubFamily asubfamily=dao.getSubFamily(id,subfamilyid); //Do some other stuff return asubfamily.getFamily(); } }
有关更多详细信息,请参见Springs Tx Reference的第9章 。
- Hibernate Bi-Directional多对多关联创建重复
- 使用Hibernate EntityManager(与Hibernate Core相比)的任何缺点?
- 在OneToMany注释列表中重复
- 无法将java.lang.Integer字段设置为java.lang.Integer
- 如何构建一个动态查询,该查询添加了迄今为止的天数,并使用条件API将该日期与另一个日期进行比较?
- 如何在hibernate中实现触发器
- Struts 2和Hibernate中的exception处理
- 无法解析org.springframework.transaction.annotation.Transactional的依赖项
- 如何从不同的位置加载hibernate.cfg.xml