2

我在我的项目中使用 Spring + JPA + Hibernate。项目结构如下: - DAO 层 - 负责获取数据。DAO 以模型对象的形式返回数据。- 服务层 - 调用 DAO 并以 UI 所需的形式处理/转换(模型)数据。

我将@Transactional 用于服务层上的方法。

我面临的问题是,有时在从延迟加载的集合中读取数据时出现“会话已关闭”错误。我也没有一直面临这个问题。从 TestNG 测试运行时以及将应用程序部署为 WAR 时,有时会出现此错误。

我正在粘贴运行 TestNG 测试时遇到的异常:

org.hibernate.SessionException:会话已关闭!在 org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72) 在 org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:305) 在 org.hibernate.loader.Loader.doQuery(Loader.java:854 ) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 在 org.hibernate.loader.Loader.loadEntity(Loader.java:2037) 在 org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader. java:86) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3268) at org.hibernate.event.def .DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:496) 在 org.hibernate.event.def。

这是我第一个使用 Spring/JPA/Hibernate 的项目。我无法找出可能导致此问题的原因?还有什么可以解决这个问题?

如果需要更多信息,请告诉我。任何帮助/指针都非常感谢:)

4

1 回答 1

1

当您获取惰性对象时,您会收到代理对象而不是真实对象。

这可能是因为您在事务完成和会话关闭后尝试访问未启动的代理对象。

我相信您需要考虑以下两种选择:

  1. 认真检查您的事务边界,并确保您的所有对象操作都发生在这些事务边界内。这将类似于“在视图中打开会话”设计模式。

  2. 制作您的所有收藏品EAGER。在这种情况下,您将收到很多不必要的数据库查询。

希望能帮助到你。

于 2012-04-28T09:07:01.587 回答