当数据正确显示时,为什么我会在此 Spring MVC Web 应用程序中收到 Hibernate LazyInitializationException?

2023-11-25

我正在尝试使用 Spring MVC 创建一个 Web 应用程序,并使用 Hibernate 作为其 ORM 层。然而,由于我对这两个框架都缺乏经验,所以我很挣扎。

以下代码将正确显示我正在查找的所有记录,但仍将堆栈跟踪放入我的日志中。我无法找到有关集成 Hibernate 和 SpringMVC 的完整文档(我查看了 springsource.org 并阅读了互联网上的各种文章)。谁能指出我在这里可能做错了什么?

请注意,我花了一些时间尝试在互联网上寻找答案,包括查看this所以问题。不幸的是,这没有帮助。

我还应该注意到,该应用程序的 ORM 部分已在独立的 Java 应用程序中使用和测试,没有出现任何问题。所以我相信 Spring MVC 和 Hibernate 的集成导致了这个问题。

这是堆栈跟踪(已截断),其中包含著名的延迟初始化问题;

2009-03-10 12:14:50,353 [http-8084-6] ERROR org.hibernate.LazyInitializationException.<init>(LazyInitializationException.java:19) - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
    at com.generic.orm.generated.SearchRule$$EnhancerByCGLIB$$92abaed6.toString(<generated>)
    at java.lang.String.valueOf(String.java:2827)
    at java.lang.StringBuffer.append(StringBuffer.java:219)
    at org.apache.commons.lang.builder.ToStringStyle.appendDetail(ToStringStyle.java:578)
    at org.apache.commons.lang.builder.ToStringStyle.appendInternal(ToStringStyle.java:542)
    at org.apache.commons.lang.builder.ToStringStyle.append(ToStringStyle.java:428)
    at org.apache.commons.lang.builder.ToStringBuilder.append(ToStringBuilder.java:840)
    at org.apache.commons.lang.builder.ReflectionToStringBuilder.appendFieldsIn(ReflectionToStringBuilder.java:606)
.....

这是我的网页控制器的代码;

private List<Report> getReports() {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    List<Report> reports = session.createCriteria(Report.class).list();
    Hibernate.initialize(reports);

    session.getTransaction().commit();
    return reports;
}

在网页上使用该显示html;

<table border="1">
    <c:forEach items="${model.reports}" var="report">
        <tr>
            <td><c:out value="${report.id}"/></td>
            <td><c:out value="${report.username}"/></td>
            <td><c:out value="${report.thresholdMet}"/></td>
            <td><c:out value="${report.results}"/></td>
            <td><c:out value="${report.searchRule.name}"/></td>
            <td><c:out value="${report.uuid}"/></td>
        </tr>
    </c:forEach>
</table>

注意:我添加了 report.searchRule.name 来测试是否可以获取报表对象中的对象。显示效果很好。

在我的 applicationContext.xml 中;

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        </props>
    </property>
</bean>

以下是 ORM 映射,以防万一;

hibernate.cfg.xml(根据要求)

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="hibernate.connection.url">jdbc:sqlserver://<removed></property>
    <property name="hibernate.connection.username"><removed></property>
    <property name="hibernate.connection.password"><removed></property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.show_sql">false</property>
    <mapping resource="com/generic/orm/generated/Report.hbm.xml"/>
    <mapping resource="com/generic/orm/generated/FieldRule.hbm.xml"/>
    <mapping resource="com/generic/orm/generated/Reconciliation.hbm.xml"/>
    <mapping resource="com/generic/orm/generated/SearchRule.hbm.xml"/>
    <mapping resource="com/generic/orm/generated/IndexTemplate.hbm.xml"/>
    <mapping resource="com/generic/orm/generated/Field.hbm.xml"/>
    <mapping resource="com/generic/orm/generated/ErrorCode.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

来自report.hbm.xml

<hibernate-mapping>
    <class name="com.generic.orm.generated.Report" table="Report" schema="dbo" catalog="CoolRecon">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <timestamp name="timeStamp" column="TimeStamp" />
        <many-to-one name="searchRule" class="com.generic.orm.generated.SearchRule" fetch="select">
            <column name="SearchRuleName" length="50" not-null="true" />
        </many-to-one>
        <many-to-one name="errorCode" class="com.generic.orm.generated.ErrorCode" fetch="select">
            <column name="ErrorCodeId" />
        </many-to-one>
        <many-to-one name="reconciliation" class="com.generic.orm.generated.Reconciliation" fetch="select">
            <column name="ReconciliationName" length="100" />
        </many-to-one>
        <property name="username" type="string">
            <column name="Username" length="50" />
        </property>
        <property name="supersheetDate" type="timestamp">
            <column name="SupersheetDate" length="23" not-null="true" />
        </property>
        <property name="milliSecondsTaken" type="long">
            <column name="MilliSecondsTaken" not-null="true" />
        </property>
        <property name="thresholdMet" type="boolean">
            <column name="ThresholdMet" not-null="true" />
        </property>
        <property name="results" type="int">
            <column name="Results" not-null="true" />
        </property>
        <property name="exception" type="string">
            <column name="Exception" length="750" />
        </property>
        <property name="uuid" type="string">
            <column name="UUID" length="36" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

我刚刚经历了这场 LazyInitialization 马拉松。

核心问题是您试图在生命周期之外访问 hibernate 管理的实体Session,即在 Spring MVC 的 Web 视图中。就我而言,这是一个List<> @OneToMany关联,默认情况下是延迟加载的。

有几种不同的方法 - 马克提到了一种方法,您可以对惰性关联进行“虚拟”迭代。您还可以通过配置(类范围)强制预先加载(在 JPA 中,它是@Fetch(value = FetchType.EAGER))或更具体地说是通过 HQL。但这将证明更多如果你的懒惰关联是有问题的Lists.

我发现的最干净的解决方案是使用 Spring 的OpenEntityManagerInViewFilter(有一个OpenSessionInViewFilter对于 Hibernate)——您放入的一个简单的 servlet 过滤器web.xml(领先于其他 servlet 过滤器),Spring 将自动创建一个线程安全、事务感知的过滤器Session 每个 HTTP 请求。不再LazyInitializationException!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当数据正确显示时,为什么我会在此 Spring MVC Web 应用程序中收到 Hibernate LazyInitializationException? 的相关文章

随机推荐

  • jQuery:查找部分类名[重复]

    这个问题在这里已经有答案了 我想看看是否 li 有一个特定的类 但问题是它们都是唯一的 但都包含一个常量字符串 unqID 我想检查一下是否 li li 有一个包含该字符串的类 如果不存在 则将新类添加到 li li 我知道如何查找元素是否
  • 如何调整 的宽度?

    我使用宽度属性作为 对于所有列 但在显示中 列没有调整 我可以通过这种方式进入吗 如果 请指导我实现我想要的列宽 您必须使用columnClasses属性并用逗号 分隔每个列样式 下面的代码示例展示了如何使用columnClassess属性
  • R--在字符串中添加前导零,没有固定的字符串格式

    我有一个专栏如下 9453 55489 4588 18893 4457 2339 45489HQ 7833HQ 如果数字少于 5 位 我想添加前导零 然而 有些号码最后有 HQ 有些没有 我确实检查了其他帖子 他们在 HQ 部分没有类似的问
  • 实体框架连接字符串问题

    我正在制作一个小库 DLL 来管理用户及其角色 权限 计划是能够将此 dll 添加到 MVC 项目中并能够操作用户 角色等 所有数据都驻留在 SQL 数据库中 我正在使用实体框架进行数据访问 因此 当我初始化一个新的 RoleManager
  • Convert.ToInt32 和 (int) 有什么区别?

    以下代码会引发编译时错误 例如 无法将类型 string 转换为 int string name Session name1 ToString int i int name 而下面的代码可以成功编译并执行 string name Sessi
  • C - 并行执行 fork() 时 wait(NULL) 的含义

    在下面的代码中 分叉实际上是并行运行还是一个接一个地运行 是什么意思wait NULL 程序创建 n 个子进程 n 通过命令行提供 int main int argc char argv int i pid for i 0 i lt ato
  • 在“www.foo.com”页面上,从“www.example.com”加载的脚本可以向“www.example.com”发送ajax请求吗?

    这是否受到跨域策略的限制 你不能 您只能将请求发送至www foo com
  • Windows 上的 python psutil 拒绝访问

    操作系统 windows专业版 我正在尝试使用 psutil 获取进程列表及其 CPU 使用情况 我以管理员身份运行脚本 但在遇到进程 DymoPnpService exe 时失败 可能是什么问题 import psutil def pro
  • 空派生优化

    大多数 C 程序员都知道空基类优化是一种技术 idiom 空的子班级会发生什么 例如 class EmptyBase int i template
  • C语言中如何对函数进行排序? “函数的先前隐式声明位于此处”错误

    我确信以前有人问过这个问题 但我找不到任何对我有帮助的东西 我有一个带有 C 函数的程序 如下所示 function2 function1 function1 function2 main function1 它比这更复杂 但我正在使用递归
  • 有没有人使用 Microsoft UI Automation 成功实施 UI 测试自动化制度?

    我正在寻找自动化 UI 测试框架 软件工具 过去我一直在使用测试完成 虽然它是一个很好的软件 但是 GUI 测试自动化的概念被认为是足够困难的 所以我写了一些帖子 to complain about it 第三方测试自动化工具的问题之一是您
  • Rails Passenger Glyphicon CORS Cloudfront NGINX 问题

    所以我知道 stackoverflow 上有关于 CORS Nginx Cloudfront 和 Heroku 的这些问题 但由于某种原因我无法让它工作 我一直在关注这个问题的答案 如何使用 Rails nginx 和乘客配置 Access
  • 使用 PostgreSQL 在 Vapor 3 中上传图像

    我正在关注这些人马丁 拉塞克教程 现在我处于 图像上传 似乎没有人能回答 Vapor 3 如何上传图片 这个问题 数据库连接正常 所有其他值均已保存 这是我的创建方法 func create req Request throws gt Fu
  • validates_inclusion_of 在 Rails 4.1 中不再工作?

    以下代码确保time zone选择的时区范围内ActiveSupport TimeZone us zones validates inclusion of time zone in ActiveSupport TimeZone zones
  • Django:服务器退出时如何运行函数?

    我正在编写一个 Django 项目 其中使用 Popen 打开多个进程 现在 当服务器退出时 这些进程就会被孤立 我有一个函数来终止这些进程 我希望对其进行组织 以便在服务器退出时自动调用该函数 任何帮助将不胜感激 由于您尚未指定正在使用哪
  • 内容范围和范围标头之间的区别?

    HTTP 标头有什么区别Content Range and Range 每种应该什么时候使用 我正在尝试从特定字节偏移量流式传输音频文件 我应该使用Content Range or Range header 事实上 接受的答案并不完整 Co
  • 已删除InDjango19警告:模型未声明显式 app_label

    已经经历过 Django 1 9 弃用警告 app label 但答案无法解决我的问题 所以再次询问 我有一个应用程序已添加到设置中的 INSTALLED APPS 中 每当我跑步时manage py runserver 我收到这个警告 t
  • python请求:发布和大内容

    我正在使用 POST 请求将 CSV 文件发送到服务器 我正在使用类似文件的对象requests post 如果 CSV 文件很大并且我的内存有限 或者我使用类似文件的对象永远不会将整个文件加载到内存中 是否会出现问题 我对此不太确定 我知
  • 无法返回字符串切片向量:借用的值寿命不够长

    我是 Rust 新手 在借用检查器方面遇到了一些问题 我不明白为什么这段代码无法编译 抱歉 如果这与之前回答的问题很接近 但我似乎无法在我看过的其他问题中找到解决方案 我理解相似之处但在这种情况下 它只是返回一个字符串 不足以让我对我试图返
  • 当数据正确显示时,为什么我会在此 Spring MVC Web 应用程序中收到 Hibernate LazyInitializationException?

    我正在尝试使用 Spring MVC 创建一个 Web 应用程序 并使用 Hibernate 作为其 ORM 层 然而 由于我对这两个框架都缺乏经验 所以我很挣扎 以下代码将正确显示我正在查找的所有记录 但仍将堆栈跟踪放入我的日志中 我无法