Ограничить дочерние дубликаты при создании объекта в db4o - PullRequest
0 голосов
/ 13 сентября 2011

Это очень распространенная ситуация, но я вроде как использую ORM, особенно в Android, так что ваша помощь будет потрясающей.

Область действия: Объект, например, Message имеет примитивные поля иполе (дочерний элемент) другого объекта, например, Обсуждение.Так выглядит:

 public class Message {

    private int id;
    private String text;
    private Discussion discussion;

    public Message(int id, String text, int discussionId){
        this.id=id;
        this.text=text;
        discussion = new Discussion (discussionId);
    }
}

public class Discussion {

    private int id;
    private String title;

    public Discussion(int id) {
        this.id = id;
        this.title = "Sample title";
    }
}

note :: id предоставляется сервером, поэтому он устанавливается вручную.

Проблема: как вы знаете, несколько сообщений могут принадлежать одному обсуждению.Но когда я сохраняю список сообщений, я получаю таблицу с дублирующимися обсуждениями (того же размера, что и таблица сообщений).Как этого избежать?

Вот как я храню Message ArrayList:

ArrayList<Message> itemsList = new ArrayList<Message>;
itemsList.add(new Message(1, "Message 1", 50));
itemsList.add(new Message(2, "Message 2", 50));

ItemDBProvider dbProvider = new ItemDBProvider();

for (Item item:itemsList) {
    dbProvider.store(item);
}

dbProvider.getDB().commit();
dbProvider.close();

Я имею в виду, что каким-то образом db4o должен проверить, находится ли объект обсуждения в db (по полю "id") и ограничить создание дубликата.Это реально?

1 Ответ

3 голосов
/ 13 сентября 2011

Db4o не знает, что вы собираетесь объединять разные объекты обсуждения, поскольку они имеют одинаковое поле идентификатора.Db4o различает объекты по их идентичности (то есть оператору ==), а не по полям объекта.Вы можете иметь сотни одинаковых объектов в базе данных.

Нет причин создавать новый Discussion объект для каждого Message - извлечь существующий и установить его в качестве поля discussionваш новый объект сообщения.

...