-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Hibernate/Spring "could not initialize proxy-no Session
PostPosted: Thu Jun 14, 2007 5:00 am 
Beginner
Beginner

Joined: Thu Jun 14, 2007 4:33 am
Posts: 39
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)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 5:17 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Also im ersten Moment würde ich darauf Tippen, dass Spring die Hibernate Verbindung nicht aufbaut.

Aber aufgrund dieser Fehlermeldung

Quote:
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


denke ich mir eher folgendes:

Du hast Dein Objekt geladen. Dieses Objekt enthält eine gemappte Collection die Du ausgeben möchtest.
Du holst Dir das Objekt aus der Db, greifst auf die Collection zu und der Fehler wird geworfen.

Nun das liegt dann am LazyLoading. Deine Load-methode scheint direkt nach dem eigentlichen Ladevorgang die Session zu beenden. Dadurch geht das geladene Objekt vom Zustand Persistent in den Zustand Detached über. Die Collection wurde aber noch nicht geladen! Greifst darauf zu versucht Hibernate die Daten mithilfe der ursprünglichen Session nachzuladen. Diese Session ist aber geschlossen. Wenn dies wirklich der Fehler sein sollte, muss du entweder Dein Transactions-Management innerhalb der Applikation ändern oder die Collection direkt in der Load-Methode einmal mit dem getter ansprechen.

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 5:37 am 
Beginner
Beginner

Joined: Thu Jun 14, 2007 4:33 am
Posts: 39
Kling für mich schon logisch, aber wie gesagt benütze ich das HibernateTemplate (org.springframework.orm.hibernate3.HibernateTemplate):
Quote:
The central method is execute, supporting Hibernate access code implementing the HibernateCallback interface. It provides Hibernate Session handling such that neither the HibernateCallback implementation nor the calling code needs to explicitly care about retrieving/closing Hibernate Sessions, or handling Session lifecycle exceptions. For typical single step actions, there are various convenience methods (find, load, saveOrUpdate, delete).

Es sollte ja so sein, dass ich mich gar nicht um die Transaktion kümmern brauche. Ich könnte die load-Funktion deshalb auch gar nicht anpassen, sondern nur überschreiben, was ich nicht will wenn es nicht unbedingt notwendig ist..
Außerdem schaut meine gemappte Klasse so aus:
Code:
public class ub_mobile_handset_model {

   
    public ub_mobile_handset_model(){
    }

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;

        ub_mobile_handset_model that = (ub_mobile_handset_model) o;

        if (manufacturer != null ?
                !manufacturer.equals(that.manufacturer) : that.manufacturer != null)
            return false;
        if (model != null ?
                !model.equals(that.model) : that.model != null)
            return false;

        return true;
    }

    public int hashCode() {
        int result;
        result = manufacturer != null ? manufacturer.hashCode() : 0;
        result = 31 * result + (model != null ? model.hashCode() : 0);
        return result;
    }

    //getters and setters
    ... die üblichen generierten funktionen....

    private Integer id;
    private String manufacturer;
    private String model;
}

ich habe also nicht wirklich eine Collection. Beim Debuggen habe ich aber gesehen, dass die Klassenattribute alle null bleiben, also nicht geladen werden. Warum ist mir ein Rätsel, da wie gesagt mit der get-Funktion alles ohne Probleme funktioniert.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 5:38 am 
Beginner
Beginner

Joined: Thu Jun 14, 2007 4:33 am
Posts: 39
//sry, doppelpost


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 6:50 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Der Unterschied zwischen load und get ist ja, dass die ein Methode in einem Fehlerfall eine Exception wirft und die andere einfach null zurückgibt (leider weis ich gerade aus dem Kopf nicht mehr was welche macht).

Zu Deiner Exception habe ich bei google noch was gefunden, was Dir vielleicht weiterhilft.

www.jroller.com

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 7:26 am 
Beginner
Beginner

Joined: Thu Jun 14, 2007 4:33 am
Posts: 39
FPC wrote:
Der Unterschied zwischen load und get ist ja, dass die ein Methode in einem Fehlerfall eine Exception wirft und die andere einfach null zurückgibt (leider weis ich gerade aus dem Kopf nicht mehr was welche macht).

Das ist schon richtig, aber die Exception wird ja eben nicht von der load-Funktion geworfen, sondern beim Zugriff auf die Daten. Die load-Funktion würde eine DataAccessException ObjectRetrivalirgendwasException werfen..

Es scheint halt so, als wollte Hibernate wirklich die Klassenmember "lazy" nachladen, was ich irgendwie verhindern müsste, praktisch "eager fetching" oder so. Leider kenn ich mich da noch nicht so gut aus, bzw. kenn das nur im Zusammenhang mit Relationen zwischen verschiedenen Tables oder bei Collections, was bei mir ja alles nicht der Fall ist..

//edit:
den Artikel kannte ich schon, aber werd ihn mir nochmals genauer durchlesen, vielleicht findet sich was.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.