Ограничить дочерние дубликаты при создании объекта в db4o

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

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

 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 должен проверять, находится ли объект обсуждения в базе данных (по полю «id»), и ограничивать создание дубликатов. Это реально?


person Oleksii Malovanyi    schedule 13.09.2011    source источник
comment
Просто примечание: db4o - это не ORM (объектно-реляционный преобразователь), это объектная база данных. Здесь нет никаких отношений.   -  person Paŭlo Ebermann    schedule 13.09.2011


Ответы (1)


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

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

person Paŭlo Ebermann    schedule 13.09.2011
comment
Большое спасибо за ваши объяснения. Возможно, мне стоит найти другой способ хранить объекты в базе данных, потому что эта проверка перед сохранением звучит как боль. - person Oleksii Malovanyi; 14.09.2011
comment
Не проверять перед сохранением, а проверять перед созданием. Просто не создавайте повторяющихся объектов обсуждения. (Или не делайте их частью сообщения, сохраните только идентификатор обсуждения. Но тогда вам придется искать их, когда они вам понадобятся.) - person Paŭlo Ebermann; 14.09.2011
comment
Да, идентификатор обсуждения может справиться с ситуацией, но как ленивый мальчик я надеялся на ненужное написание дополнительного кода для получения объектов поля по запросу. Хех, еще раз спасибо! Возможно, я попробую ormlite и посмотрю, как он обрабатывает внешние связи для полевых объектов. - person Oleksii Malovanyi; 14.09.2011
comment
Привет ! Здесь такая же проблема; Вы наконец перешли на Ормлит? - person bashizip; 26.03.2014