db4o Developer Community

db4o open source object database, native to Java and .NET
Welcome to db4o Developer Community Sign in | Join
in Search
More Search Options

db4o + java.lang.ClassCastException

Last post 09-20-2008, 10:04 AM by Patrick Roemer. 5 replies.
Sort Posts: Previous Next
  •  09-17-2008, 12:30 PM 51103

    db4o + java.lang.ClassCastException

    Hallo Leute, bin ein Neuling auf dem Gebiet db4o und stosse sogleich auf einige Probleme. Wenn ich eine Session öffne und in dieser Daten in die db4o Datenbank rein schreibe und wieder auslese, alles kein Problem. Wenn ich dann allerdings zum schreiben die db öffne und danach schliesse und zum lesen sie nochmal neu öffne, bekomme ich immer exceptions geschmissen. Ich denke mal, dass es daran liegen wird das die Daten während einer Session wohl noch im Java-Speicher liegen und noch nicht in die Datenbank eingetragen wurden.

    Hier mal ne Beispielklasse zu meinem Problem:

    import java.io.File;
    import java.util.*;
    import com.db4o.*;
    import com.db4o.query.*;
    import com.db4o.ext.DatabaseFileLockedException;

    class example{
        Datenbank db = null;
       
        public example(){
            try{
                db = new Datenbank();
               
                /* schreibe irgendetwas in die Datenbank*/
                Punkt o = new Punkt(0,0,0);
                Punkt p = new Punkt(0,0,0);
                Punkt q = new Punkt(0,0,0);
               
                db.oc.store(o);
                db.oc.store(p);
                db.oc.store(q);
               
                db.oc.commit();
                   
            }catch(Exception e){
                e.printStackTrace();           
            }finally{
                db.close();           
            }
           
            /* Datenbank erneut öffnen und Daten auslesen, bzw ändern, etc.*/
           
            try{
                db = new Datenbank();
               
                /* lese alle Punkt Objekte aus der Datenbank*/
               
                Punkt proto = new Punkt(0,0,0);
               
                ArrayList<Punkt> f = new ArrayList<Punkt>();

                ObjectSet <Punkt> result=db.oc.queryByExample(proto);

                while(result.hasNext()){
                   
                    proto = result.next();
                   
                    f.add(proto);
                }       
                                    
            }catch(Exception e){
               
                e.printStackTrace();
               
            }finally{
                db.close();
               
                db.delete();           
            }           
           
        }
        public static void main(String[]tanga){
            new example();
        }
    }


    class Datenbank{
        public ObjectContainer oc = null;
        public Datenbank(){
            try{
                oc = Db4o.openFile("Kommune.db");
                System.out.println("database-connection initiated");
                           
            } catch(DatabaseFileLockedException e) {
                 e.printStackTrace();
            }
        }
        public void close(){
            if (oc != null){
                System.out.println("database-connection closed");
                oc.commit();
                oc.close();
            }
                   
        }
        public void delete(){
            new File("Kommune.db").delete();
            System.out.println("database deleted...");   
        }
    }     


    class Punkt {
        public int x,y,z;

        Punkt(int xx, int yy, int zz) {
            x=xx; y=yy; z =zz;
        }
       
        Punkt(Punkt p2) {
            x=p2.x; y=p2.y; z=p2.z;
        }
        public String toString(){
            return "x="+x+",y="+y+",z="+z;
        }
        double distanz_2 (Punkt p2) {
            final double dx = x - p2.x;
            final double dy = y - p2.y;
            return Math.sqrt(dx*dx + dy*dy);
        }
     
    }
     
     

  •  09-17-2008, 12:48 PM 51106 in reply to 51103

    Re: db4o + java.lang.ClassCastException

    irgendwie hat er jetzt das gleiche Problem auch, wenn ich das ganze in einer Session mache, also schreiben und auslesen. Wieder das Problem mit der ... cannot be cast to com.db4o.reflect.generic.GenericObject - Fehlermeldung...

     

    Hier der Code in einer Session:

    class example{
        Datenbank db = null;
       
        public example(){
            try{
                db = new Datenbank();
               
                /* schreibe irgendetwas in die Datenbank*/
                Punkt o = new Punkt(1,1,1);
                Punkt p = new Punkt(2,2,2);
                Punkt q = new Punkt(3,3,3);
               
                db.oc.store(o);
                db.oc.store(p);
                db.oc.store(q);
               
                db.oc.commit();
               
                Punkt r = new Punkt(0,0,0);

                ArrayList<Punkt> f = new ArrayList<Punkt>();           

                ObjectSet<Punkt> result = db.oc.queryByExample(Punkt.class);

                while(result.hasNext()){
                   
                    System.out.println(result.next());
                    r = result.next();
                   
                    f.add(p);
                }
                for(Punkt ko :f)
                    System.out.println("Punkt: "+ko);           

                   
            }catch(Exception e){
                e.printStackTrace();           
            }finally{
                db.close();           
            }       
        }
        public static void main(String[]tanga){
            new example();
        }
    }

     

    Würde mich über unterstützung sehr freuen... 

  •  09-17-2008, 01:02 PM 51107 in reply to 51106

    Re: db4o + java.lang.ClassCastException

    das zweite Problem hat sich erledigt, lag daran, dass ich die Datenbank datei (die ich von hand lösche) nicht gelöscht hatte... Sorry
  •  09-19-2008, 01:50 PM 51135 in reply to 51107

    Re: db4o + java.lang.ClassCastException

    also bei mir lief der source einwandfrei durch ...

     

    Konsole :

    ----------------------------------------------------------------------------

    database-connection initiated
    database-connection closed
    database-connection initiated
    database-connection closed
    database deleted...
     

    ---------------------------------------------------------------------------- 

    Allerdings habe ich keine inneren Klassen verwendet, liegt es vielleicht daran ? Welche Version von Db4o verwendest Du eigentlich, ich musste
     

    -----------------------------------------------------------------------------------

    db.oc.store(o);
    db.oc.store(p);
    db.oc.store(q);

        zu  

    db.oc.set(o);
    db.oc.set(p);
    db.oc.set(q);

        und

    ObjectSet <Punkt> result=db.oc.queryByExample(proto);

        zu

    ObjectSet <Punkt> result=db.oc.get(proto);

    ------------------------------------------------------------------------------------ 

    abändern.  

     

    Gruß Arne 


    Arne Stocker
  •  09-19-2008, 01:55 PM 51136 in reply to 51135

    Re: db4o + java.lang.ClassCastException

    PS.: ich hatte den Ausdruck der Punkte versehentlich entfernt, aber wie gesagt der Source funktioniert

     -----------------------------------

    database-connection initiated
    database-connection closed
    database-connection initiated
    Punkt: x=0,y=0,z=0
    Punkt: x=0,y=0,z=0
    Punkt: x=0,y=0,z=0
    database-connection closed
    database deleted...

    ------------------------------------

     Gruß Arne


    Arne Stocker
  •  09-20-2008, 10:04 AM 51148 in reply to 51103

    Re: db4o + java.lang.ClassCastException

    Responding to LordSax:

    Kann ich nicht nachvollziehen, Dein Code laeuft hier sauber durch.

    Der Standardausloeser fuer eine "ClassCastException: GenericObject" ist,
    dass die erwartete Klasse dem db4o-Classloader (der in komplexeren
    Umgebungen wie Webapps oder OSGi nicht identisch mit dem Applikations-CL
    ist) nicht bekannt ist. Eine beliebte Art, diese Situation im
    standalone-Betrieb herzustellen und sich so selber in den Fuss zu
    schiessen, ist, das db4o-jar im lib/ext des JDK unterzubringen.

    http://developer.db4o.com/Resources/view.aspx/Reference/Usage_Pitfalls/Classloader_And_Generic_Classes

    Viele Gruesse,
    Patrick
View as RSS news feed in XML