当前位置: 首页 > 面试题库 >

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

海叶秋
2023-03-14
问题内容

我正在尝试使用Spring MVC创建一个Web应用程序,并将Hibernate作为其ORM层。但是,由于我对这两个框架的经验不足,所以我很努力。

以下代码将正确显示我要查找的所有记录,但仍将堆栈跟踪信息放入日志中。我在查找有关集成Hibernate和SpringMVC的详尽文档时遇到了麻烦(我查看了springsource.org并阅读了Internet上的各种文章)。谁能指出我在这里可能做错了什么?

请注意,为此,我花了一些时间试图在互联网上找到答案,包括查看此 SO问题。不幸的是,这没有帮助。

我还应该注意,该应用程序的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来测试是否可以到达report对象内的对象。它显示正常。

在我的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>

问题答案:

我只是在猜测,但是从堆栈跟踪来看,似乎在SearchRule上调用了toString。SearchRule是否有任何未加载的子对象?如果SearchRule.toString试图获取未初始化的子对象的值,则可能导致LazyInitializationException。



 类似资料:
  • 如果fcm消息包含“通知”部分,而应用程序在后台,则通知传递到系统托盘和数据中的附加意图。 问题是,我无法更改该通知的重要性,而且它们总是不显示弹出窗口。我为API26+修复了这个问题,我添加了通知通道 但对于API25-我找不到解决方案。一个建议是删除“notification”部分,只保留“data”,这将允许fcm将消息传递到 当应用程序在后台/前台,我将能够显示我的自定义通知。

  • 我正在创建一个系统,使用GUI形式的链表存储数据。我在存储和显示链表时遇到了一些问题。看来我输入数据后,它并没有存储到链表中 我所做的是一个图书馆系统,所以我需要的是将书名、作者名、ISBN号和图书的拷贝数存储到链表中的单个节点中。这些信息来自用户输入,例如JTextField1。我的讲师教过我如何插入单个数据,但现在我需要插入多个数据。 我在Node类中重新创建了构造函数和getter方法,并在

  • 问题内容: 我做了一个将我的JFrame设置为全屏的JButton: 这是JFrame: 为什么当我运行游戏并全屏选择JButton时,JPanel渲染不正确? 我的意思是说,在我的黑色背景上有一个很大的灰色JPanel,没有JButton呈现。 问题答案: 问题是您正在创建多个不同的实例,但您完全不知道屏幕上实际可见哪个实例。 ,创建实例和调用,它创建的实例,以及......别急,我们,为什么我

  • 问题内容: 它是如何存在的?它是什么? 我想这部分是本教程中使用的模型的小写版本,但是什么是?你能详细说明吗? 问题答案: 你创建了一个外键,每个外键都与一个外键相关。 因此,每个显式都有一个字段,你可以在模型中声明该字段。 Django的ORM也遵循这种关系,在每个实例上自动生成一个名为是模型的字段,其中包含该模型的字段。 是一个可以创建实例相关的对象的查询集的,例如 如果你不喜欢Django自

  • 我最近尝试在Libgdx中为我的标签提供背景,因为如果没有自定义皮肤,您将只剩下一些白色文本的空白石板。 使用这里找到的皮肤编辑器,我可以根据自己的喜好制作一个标签样式,我想在我的项目中使用。然而,使用这些文件构建我的皮肤,似乎什么都没有发生。 对于这些文件,我尝试使用: 在我的桌子上使用它: 在我的标签中: 但都无济于事。 有人知道为什么它仍然显示为纯白色文本吗?谢谢您们。 这是uiskin.j