Próbuję utworzyć aplikację internetową przy użyciu Spring MVC, a jako warstwę ORM jako warstwę Hibernate. Jednak ze względu na brak doświadczenia w obu frameworkach mam problemy.Dlaczego otrzymuję Hibernate LazyInitializationException w tej wiosennej aplikacji internetowej MVC, gdy dane są wyświetlane poprawnie?
Poniższy kod poprawnie wyświetli wszystkie poszukiwane rekordy, ale nadal będzie zawierał ślad stosu w moich dziennikach. Mam problem ze znalezieniem szczegółowej dokumentacji dotyczącej integracji Hibernate i SpringMVC (zajrzałem do springsource.org i przeczytałem różne artykuły na temat interweb). Czy ktokolwiek mógłby wskazać, co mógłbym robić źle tutaj?
Należy zauważyć, że spędziłem kilka prób, aby znaleźć odpowiedzi w Internecie na ten temat, w tym na pytanie this SO. Co niestety nie było pomocne.
Należy również zauważyć, że część ORM tej aplikacji została bez problemu wykorzystana i przetestowana w samodzielnej aplikacji Java. Uważam, że przyczyną problemu jest integracja Spring MVC i Hibernate.
Oto ślad stosu (obcięty) ze słynnym problemem leniwego inicjowania;
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)
.....
Oto kod kontrolera mojej strony internetowej;
Który jest używany na stronie internetowej przy użyciu tego wyświetlacza html;
Uwaga: Dodałem report.searchRule.name, aby przetestować, czy mogę uzyskać dostęp do obiektów w obiekcie raportu. Wyświetla się dobrze.
I w moim 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>
Oto odwzorowania ORM, na wszelki wypadek;
hibernate.cfg.xml (na żądanie)
<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>
Od 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>
pls POST mapowanie także dla raportów –
Dodano plik hibernate.cfg.xml, który zawiera moje mapowania. –
Czy możesz wyświetlić plik Report.hbm.xml? –