Avatar billede dl Nybegynder
18. november 2007 - 09:47 Der er 7 kommentarer og
1 løsning

Hvorfor kan jeg ikke få den exception (spring)

Jeg har et kørende spring/hibernate program, jeg kan ligge en zipcode og en customer ned i en DB. Det virker.

Men hvis jeg nu forsøger at hente en customer op, som ikke findes, så går det galt.

/// kode ///

public class CustomerDAO {

    private HibernateOperations hibernateOperations;

    public Customer retrieveCustomer(long customerID) throws CustomerDoesNotExists {
        Customer customer;
        customer = (Customer) hibernateOperations.load(Customer.class, customerID);
       
//        if (hibernateOperations.contains(customer))
//            throw new CustomerDoesNotExists();
        return customer;
    }

/// slut ///

jeg får denne exception:

log4j:WARN No appenders could be found for logger (org.springframework.beans.factory.xml.XmlBeanDefinitionReader).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
    at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
    at cws.entity.Customer$$EnhancerByCGLIB$$94e98969.toString(<generated>)
    at conf.Main.run(Main.java:39)
    at conf.Main.main(Main.java:43)


derfor vil jeg fange en exception, og derfra kalde min egen.
hvis jeg læser i hibernate dok,

http://static.springframework.org/spring/docs/1.1.5/api/org/springframework/orm/hibernate/HibernateOperations.html#load(java.lang.Class,%20java.io.Serializable)


så vil hibernate.... load, give mig en

HibernateObjectRetrievalFailureException


hvis en instance ikke findes. Men hvis jeg omgiver min kode, med en try catch block:

    public Customer retrieveCustomer(long customerID) throws CustomerDoesNotExists {
        Customer customer = null;
        try {
            customer = (Customer) hibernateOperations.load(Customer.class, customerID);
        } catch (HibernateObjectRetrievalFailureException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
            throw new CustomerDoesNotExists();
        }           
        return customer;
    }


så få jeg samme fejl: altså min try catch bloc er ikke blevet kalt.

log4j:WARN No appenders could be found for logger (org.springframework.beans.factory.xml.XmlBeanDefinitionReader).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
    at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
    at cws.entity.Customer$$EnhancerByCGLIB$$84c91598.toString(<generated>)
    at conf.Main.run(Main.java:39)
    at conf.Main.main(Main.java:43)



Hvordan skal jeg fedt min egen lille exception ind ?
Avatar billede dl Nybegynder
18. november 2007 - 10:25 #1
Jeg må jo så også konstater, at jeg ren faktisk heller ikke kan hente data op. Hvorfor ikke, når jeg kan smide data ned... og det kan jeg, da jeg kan se det, i phpmyadmin
Avatar billede arne_v Ekspert
18. november 2007 - 15:59 #2
Jeg tror at problemet er lidt andereledes end du tror.

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

siger mig at:
- du loader successfuldt med load
- du bruger lazy loading d.v.s. at de data som ligger i en anden tabel først
  loades når du skal bruge dem
- på det tidspunkt du faktisk skal bruge dem og derforsøger at loade dem så er
  din session (hibernateOperations) closed
Avatar billede arne_v Ekspert
18. november 2007 - 15:59 #3
Enten skal du holde din session åben eler så skal du slå lazy loading fra.
Avatar billede dl Nybegynder
18. november 2007 - 16:48 #4
hmm .. min mapning ser således ud:
<hibernate-mapping>
    <class name="cws.entity.Customer" table="Customers">
       
        <id name="customerID" column="customerID">
            <generator class="assigned" />
        </id>

        <property name="name" column="name" type="string"/>
        <property name="email" column="email" type="string"/>
       
        <many-to-one name="zipcodeID" column="zipcodeID" class="cws.entity.Zipcode"
                    cascade="save-update" not-null="true" lazy="false" />

    </class>
</hibernate-mapping>


Eller er det i min  application-context fil, det skal slåes fra, og hvordan gøres dette ?

//dennis
Avatar billede dl Nybegynder
18. november 2007 - 16:56 #5
derudover, så i min main metode. Der bruger jeg ikke min zipcode.

        Customer cus = controller.retrieveCustomer(3);
        System.out.println("navn: " + cus.getName());

jeg prøver kun at skrive navnet ud :S
Avatar billede dl Nybegynder
18. november 2007 - 20:38 #6
Så blev problemet løst, efter flere timer på nettet.
Arne_v, du havde så ret :) hvis bare vi alle hevde alle de guldkort, kom med et svar.

til andre.
Problemet var lasy load. Der er nogle tilfældet, hvor man skal tage hensyn til lasy load, eller non-lasyload.

dette gøres i mapningen af classen.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="cws.entity.Customer" table="Customers" lazy="false">
       
        <id name="customerID" column="customerID">
            <generator class="assigned" />
        </id>

        <property name="name" column="name" type="string"/>
        <property name="email" column="email" type="string"/>
       
        <many-to-one name="zipcode" column="zipcodeID" class="cws.entity.Zipcode" cascade="save-update" />

    </class>
</hibernate-mapping>


som det kan ses her:

<class name="cws.entity.Customer" table="Customers" lazy="false">

lasy="false"  dette gør, zipcoden bliver loadet op med customer.

//dennis
Avatar billede arne_v Ekspert
18. november 2007 - 20:52 #7
svar
Avatar billede simonvalter Praktikant
19. november 2007 - 11:13 #8
Lidt at læse om lazy fetching, feks forslag til hvordan du holder session åben, skulle du få brug for det.

http://www.javalobby.org/java/forums/t20533.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester