DB4O не обновляет объект при добавлении объекта к одному из его аргументов, который является списком объектов - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть объект с именем serie, у которого есть 3 аргумента

private String name;
    private String picfile;
private Vector<Episode> episodes = new Vector<Episode>();

Я получаю серию, которую ищу, и добавляю в нее эпизод

, затем этот эпизод добавляется всерия, но после закрытия ObjectContainer и перезапуска программы серия теряет эпизод.

надеюсь, что кто-то может помочь.

вот весь код

public class Db4o {

/**
 * @param args the command line arguments
 */
static ObjectContainer db;
static final String path="C:\\Users\\naki\\Documents\\wordmanagement";

public static void afficher(ObjectContainer db)
{
    ObjectSet<Serie> result=db.queryByExample(Serie.class);
    while(result.hasNext())
    {
        System.out.println(result.next());
    }
}
public static void main(String[] args) throws MalformedURLException {
    // TODO code application logic here

        try{
       // new File(path).delete();
        db=Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), path);
        System.err.println("it's connectetd");
        Serie s1=new Serie();
        s1.setName("Kungfu Panda");

        File file=new File("E:\\Series\\Word pic\\250px-Kung_Fu_Panda_-_Legends_of_Awesomeness_logo.jpg");

        s1.setPicfile(file.toString());
        Episode episode=new Episode();
        episode.setNumbre(4);
        episode.setTitle("The magic Po");
        episode.setSerieName("Kungfu Panda");
        db.store(episode);
        s1.setEpisode(episode);
        db.store(s1);
        ObjectSet<Serie> result=db.queryByExample(new Serie("Kungfu Panda"));
        Serie s=result.next();
        s.setEpisode(episode);

        afficher(db);

        }
        finally
        {
            db.close();
        }

}


public class Serie {
private String name;
    private String picfile;
private Vector<Episode> episodes = new Vector<Episode>();

public String getPicfile() {
    return picfile;
}

public void setPicfile(String picfile) {
    this.picfile = picfile;
}

public Serie(String name) {
   this.name=name; 
}

public Vector<Episode> getEpisodes() {
    return episodes;
}

public void setEpisode(Episode e) {
    this.episodes.add(e);
}



public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "Serie{" + "name=" + name + ", picfile=" + picfile + ", episodes=" + episodes + '}';
}


public class Episode {
private int numbre;
private String title;
    private String  serieName;
private ArrayList<Word> words = new ArrayList<Word>();

public Episode(int numbre, String titl, String  serieName,ArrayList<Word> words) {

    this.numbre = numbre;
    this.title = title;
    this.serieName=serieName;
     this.words = words;
}

public Episode() {

}

public String getSerieName() {
    return serieName;
}

public void setSerieName(String serieName) {
    this.serieName = serieName;
}


public int getNumbre() {
    return numbre;
}

public void setNumbre(int numbre) {
    this.numbre = numbre;
}


public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public ArrayList<Word> getWords() {
    return words;
}

public void setWords(ArrayList<Word> words) {
    this.words = words;
}

@Override
public String toString() {
    return "{" + "Episode=" + numbre + " , title=" + title + '}';
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Я не вижу, где вы закрываете и снова открываете базу данных.

В любом случае, я просто запускаю ваш код (с некоторыми изменениями, например, для повторного открытия базы данных), и он действительно получает Serie правильно, то есть с его эпизодом.

См. Код ниже:

import java.io.*;
import java.net.*;
import java.util.*;

import com.db4o.*;

public class Db4o {

    static final String path = System.getenv("temp") + "\\test.odb";

    public static void afficher(ObjectContainer db) {
        ObjectSet<Serie> result = db.queryByExample(Serie.class);
        while (result.hasNext()) {
            System.out.println(result.next());
        }
    }

    public static void main(String[] args) throws MalformedURLException {
        ObjectContainer db = null;
        try {

            new File(path).delete();
            db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), path);
            System.err.println("it's connectetd");

            Serie s1 = new Serie("Kungfu Panda");
            File file = new File(
                    "E:\\Series\\Word pic\\250px-Kung_Fu_Panda_-_Legends_of_Awesomeness_logo.jpg");
            s1.setPicfile(file.toString());

            Episode episode = new Episode(4, "The magic Po", "Kungfu Panda");
            s1.setEpisode(episode);
            db.store(s1);    

            // Reopen the database
            db.close();    
            db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), path);

            afficher(db);

        } finally {
            db.close();
        }

    }
}

class Serie {
    private String name;
    private String picfile;
    private Vector<Episode> episodes = new Vector<Episode>();

    public String getPicfile() {
        return picfile;
    }

    public void setPicfile(String picfile) {
        this.picfile = picfile;
    }

    public Serie(String name) {
        this.name = name;
    }

    public Vector<Episode> getEpisodes() {
        return episodes;
    }

    public void setEpisode(Episode e) {
        this.episodes.add(e);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Serie{" + "name=" + name + ", picfile=" + picfile
                + ", episodes=" + episodes + '}';
    }
}

class Episode {
    private int numbre;
    private String title;
    private String serieName;

    public Episode(int numbre, String titl, String serieName) {

        this.numbre = numbre;
        this.title = titl;
        this.serieName = serieName;
    }

    public Episode() {

    }

    public String getSerieName() {
        return serieName;
    }

    public void setSerieName(String serieName) {
        this.serieName = serieName;
    }

    public int getNumbre() {
        return numbre;
    }

    public void setNumbre(int numbre) {
        this.numbre = numbre;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String toString() {
        return "{" + "Episode=" + numbre + " , title=" + title + '}';
    }
}

Обратите внимание, что в конструкторе Episode произошла ошибка:

public Episode(int numbre, String titl, String serieName) {
    this.numbre = numbre;
    this.title = title; // WRONG. Need to be: this.title = titl;
    this.serieName = serieName;
}
0 голосов
/ 14 февраля 2012

Пожалуйста, проверьте, не возникает ли у вас проблема с глубиной обновления (проверьте последнюю часть этого блога):

http://www.gamlor.info/wordpress/2009/09/db4o-activation-update-depth/

Best.

...