java - "non-web"Spring 应用程序中的 Hibernate LazyInitializationExceptioin

标签 java spring hibernate lazy-loading

我在控制台应用程序中使用 Spring 3.1 和 Hibernate 4(我正在尝试这些框架的一些功能及其集成)。

如何解决非网络应用程序中的 Hibernate LazyInitializationExceptioin

我对使用 OpenSessionInViewFilter 很感兴趣,但对不使用 servlet 的应用程序一无所知... 哪种方法才是解决问题的正确方法?

最佳答案

在将 hibernate 加载的实例返回到控制台应用程序的 View 层之前,请始终确保您需要在 View 层中显示或访问的实体已初始化。

您可以使用以下方法强制初始化实体:

  1. Hibernate.initialize() :

    例如,您必须在 View 层中显示一个Order 的所有orderDetail,但您的控制台应用程序只加载一个order实例。假设 orderDetail 是延迟加载的,在将 order 返回给 View 层之前,调用 Hibernate.initialize(order.getOrderDetail())

  2. 使用 fetch join获取 orderDetail 以及 order 导致返回的 order 对象的 orderDetail 完全初始化:

    SELECT order FROM Order order join fetch order.orderDetail


更新:

@OneToMany 上的

fetch = FetchType.EAGER 是第三个选项。这会导致如果加载了一个order,它的orderDetail也会被自动加载和初始化。但这会影响全局。我们通常不会将 @OneToMany 的默认延迟获取计划更改为急切获取映射元数据,除非它绝对确定要这样做。相反,我们使用 fetch join(选项 2)来覆盖默认的延迟获取计划,以便为特定用例急切获取。

关于java - "non-web"Spring 应用程序中的 Hibernate LazyInitializationExceptioin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10087114/

相关文章:

java - 在运行时将包含 java 源的文件夹添加到类路径

java - 在类 Test 中实例化类 Test 的成员是递归吗?

java - Spring 启动 : get command line argument within @Bean annotated method

spring - 如何从服务器链接访问本地驱动器文件

spring - 从 thymeleaf 电子邮件模板访问应用程序上下文 bean

hibernate - 如何为热/暖备用 Postgresql 服务器配置 c3p0?

java - 这是PostgreSQL SQL引擎的错误,如何避免(解决方法)呢?

java - 需要帮助在 Tomcat 中设置多个领域

java - 加入 JPQL、CreateQuery

java - 可能覆盖数据库表