Hallo,
ich verwende Hibernate in Verbindung mit dem Spring-Framework und habe ein Problem mit einer für mich nicht nachvollziehbaren Exception. Da es aber eine HibernateException ist, habe ich mich entschlossen erstmal Rat bei der Hibernate-Community zu suchen.
Beim Aufrufen der HibernateTemplate.load Funktion erhalte ich keine Exception. Mein Ziel wäre es, mit der Load-Funktion zu versuchen, ein nichtvorhandenes Objekt aus meiner Datenbank zu lesen. Es sollte dann eine ObjectRetrievalFailureException geworfen werden.
Was aber passiert ist, dass die load-Funktion ausgeführt wird, ohne dass eine Exception geworfen wird, unabhängig davon, ob das Element in der Datenbank existiert oder nicht.
Will ich dann das Objekt auslesen, erhalte ich die unten beschriebene Exception (also erst bei System.out.println(model != null ? model.getManufacturer() : "Element not found");). Habe schon zig Codebeispiele und Referenzen durchgelesen, aber der Code scheint in Ordnung zu sein.
Lange Rede, kurzer Sinn: es scheint so, als würde kein richtiges SQL-Statement abgesetzt werden, warum auch immer. Verwende ich anstatt der load-Funktion aber die get-Funktion wird der Wert aber richtig aus der Datenbank ausgelesen. Ich möchte aber zu Testzwecken die load-Funktion verwenden.
Hibernate version: 3.2
Spring version: 2.0.5
Mapping documents:
Mapping File:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="domain">
<class name="ub_mobile_handset_model" table="ub_mobile_handset_model">
<id name="id"/>
<property name="manufacturer" not-null="true" type="string" column="manufacturer" />
<property name="model" not-null="true" type="string" column="model"/>
</class>
</hibernate-mapping>
Application Context:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="dataSource" class="org.postgresql.ds.PGSimpleDataSource">
<property name="serverName" value="${db.serverName}" />
<property name="databaseName" value="${db.databaseName}"/>
<property name="portNumber" value="${db.portNumber}"/>
<property name="user" value="${db.user}"/>
<property name="password" value="${db.password}"/>
</bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>jdbc.properties</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>mappings/ub_mobile_handset_model.hbm.xml</value>
</list>
</property>
</bean>
<bean id="ub_mobile_handset_modeldao" class="dao.ub_mobile_handset_modelDAO">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
Code between sessionFactory.openSession() and session.close():Dao-Code:
Code:
public class ub_mobile_handset_modelDAO extends HibernateDaoSupport {
public ub_mobile_handset_model getUb_mobile_handset_model(Integer id) throws DataAccessException {
return (ub_mobile_handset_model) getHibernateTemplate().load(ub_mobile_handset_model.class, id);
}
}
Aufrufender Code:
Code:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ub_mobile_handset_modelDAO modeldao = (ub_mobile_handset_modelDAO)context.getBean("ub_mobile_handset_modeldao");
ub_mobile_handset_model model = null;
try {
model = modeldao.getUb_mobile_handset_model(3);
} catch (ObjectRetrievalFailureException e) {
e.printStackTrace();
System.exit(1);
} catch (DataAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
System.exit(1);
} catch (Exception e){
e.printStackTrace();
System.exit(1);
}
System.out.println(model != null ? model.getManufacturer() : "Element not found");
}
Full stack trace of any exception that occurs:
Quote:
Exception in thread "main" 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 domain.ub_mobile_handset_model$$EnhancerByCGLIB$$77e6079a.getManufacturer(<generated>)
at Main.main(Main.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Name and version of the database you are using:PostgreSQL 8.2
Driver: postgresql-jdbc-8.2-505
The generated SQL (show_sql=true):Keine SQL-Statements werden angezeigt, auch nicht mit show_sql=true (was mich auch sehr verwundert, da die load-Funktion ausgeführt wird.
Debug level Hibernate log excerpt:Quote:
2007-06-14 10:46:09,955 DEBUG [main] org.springframework.context.support.ClassPathXmlApplicationContext: Publishing event in context [org.springframework.context.support.ClassPathXmlApplicationContext@18fef3d]: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@18fef3d: display name [org.springframework.context.support.ClassPathXmlApplicationContext@18fef3d]; startup date [Thu Jun 14 10:46:07 CEST 2007]; root of context hierarchy]
2007-06-14 10:46:09,955 DEBUG [main] org.springframework.beans.factory.support.DefaultListableBeanFactory: Returning cached instance of singleton bean 'ub_mobile_handset_modeldao'
2007-06-14 10:46:09,955 DEBUG [main] org.springframework.orm.hibernate3.SessionFactoryUtils: Opening Hibernate Session
2007-06-14 10:46:10,018 DEBUG [main] org.hibernate.impl.SessionImpl: opened session at timestamp: 11818107699
2007-06-14 10:46:10,018 DEBUG [main] org.hibernate.jdbc.ConnectionManager: transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
2007-06-14 10:46:10,018 DEBUG [main] org.springframework.orm.hibernate3.HibernateTemplate: Eagerly flushing Hibernate session
2007-06-14 10:46:10,018 DEBUG [main] org.springframework.orm.hibernate3.SessionFactoryUtils: Closing Hibernate Session
2007-06-14 10:46:10,018 ERROR [main] org.hibernate.LazyInitializationException: 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 domain.ub_mobile_handset_model$$EnhancerByCGLIB$$77e6079a.getManufacturer(<generated>)
at Main.main(Main.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)