2016-01-17 3 views
1

У меня есть два простых класса, как это:иностранного поля коллекции нет в БД

@DatabaseTable(tableName = "movements") 
public class Movement { 

    @DatabaseField(generatedId = true) 
    int id; 

    @DatabaseField 
    double amount; 

    @DatabaseField(foreign = true) 
    Category category; 

    @ForeignCollectionField(eager = true) 
    Collection<Tag> tags; 

    //Other stuff 
} 

И второе:

@DatabaseTable(tableName = "tag") 
public class Tag { 

    @DatabaseField(generatedId = true) 
    int id; 

    @DatabaseField(foreign = true) 
    Movement movement; 

    @DatabaseField 
    String name; 

    //Other stuff 
} 

Что я ожидаю от двух следующих команд:

TableUtils.createTable(dbConnection, Tag.class); 
TableUtils.createTable(dbConnection, Movement.class); 

- это создание двух таблиц внутри db с правильными ссылками один раз в другое. Кажется, Instean, что ForeignCollection внутри класса «Движение» игнорировался. Это могут отлаживать информацию:

[INFO] TableUtils creating table 'tag' 
[INFO] TableUtils executed create table statement changed 0 rows: CREATE TABLE `tag` (`id` INTEGER AUTO_INCREMENT , `movement_id` INTEGER , `name` VARCHAR(255) , PRIMARY KEY (`id`)) 
[INFO] TableUtils creating table 'movements' 
[INFO] TableUtils executed create table statement changed 0 rows: CREATE TABLE `movements` (`id` INTEGER AUTO_INCREMENT , `amount` DOUBLE PRECISION , `category_id` INTEGER , PRIMARY KEY (`id`) 

Я не вижу своей ошибки!

ответ

1

Индекс кажется, что ForeignCollection внутри класса «Движение» был проигнорирован.

Да, это немного запутанно, но нет никакой ошибки. Нет ничего в таблице movements, которая ссылается на tags в базе данных.

Способ, которым иностранные коллекции работают в ORMLite (например, спящий режим и другие ORM), состоит в том, что tag имеет ссылку на связанный movement_id, но не наоборот. A movement не может иметь своего рода список tag ids по определению. Вот почему ORMLite использует другой запрос для заполнения коллекции tags. Он возвращает ваш movement, а затем он ищет id от movement, чтобы найти теги, которые имеют то же самое в поле movement_id.

+0

Благодарим за разъяснение. Моя ошибка - непонимание в работе ORMLite. – Elia

Смежные вопросы