使用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章 。