ORM Lite выдает ошибку при создании таблиц, содержащих многоуровневый внешний ключ - PullRequest
2 голосов
/ 24 октября 2011

Я получаю эту ошибку в ORM Lite при создании таблицы ActivityLog:

10-23 04:06:32.255: E/com.timelord.dao.DatabaseHelper(1487): 
Caused by: java.sql.SQLException: ORMLite can't store unknown class class 
com.timelord.pojo.Category for field 'category'. Serializable fields must 
specify dataType=DataType.SERIALIZABLE

Я подозревал, что это вызвано многоуровневым внешним ключом. Как видно из класса POJO ниже, ActivityLog имеет Activity, а Activity имеет Category.

Активность и категория работают нормально.

Есть идеи, как правильно составить карту?

@DatabaseTable(tableName = "activityLogs")
public class AcitvityLog implements Serializable {

    private static final long serialVersionUID = 1L;

    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(canBeNull = false)
    @DatabaseFieldForeign(foreign = true)
    private Activity activity;

    @DatabaseField(dataType = DataType.DATE, canBeNull = false)
    private Timestamp start;

    @DatabaseField(dataType = DataType.DATE, canBeNull = true)
    private Timestamp end;
}

@DatabaseTable(tableName = "activities")
public class Activity extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @DatabaseField(canBeNull = false)
    @DatabaseFieldForeign(foreign = true)
    private Category category;
}

@DatabaseTable(tableName = "categories")
public class Category extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;
}

public class BaseEntity {
    @DatabaseField(generatedId = true)
    private Integer id;

    @DatabaseField(canBeNull = false)
    private String name;
}

1 Ответ

2 голосов
/ 24 октября 2011

Нет, ORMLite может обрабатывать многоуровневые внешние ключи без каких-либо проблем.Проблема в том, что вы не можете смешивать аннотации @DatabaseField и @DatabaseFieldForeign.То, что вы хотите:

@DatabaseField(canBeNull = false, foreign = true)
private Activity activity;

Или, если вы хотите использовать меньшие аннотации, которые работают быстрее под Android:

@DatabaseFieldSimple(canBeNull = false)
@DatabaseFieldForeign(foreign = true)

Либо вы используете просто @DatabaseField или @DatabaseFieldSimple и другие @DatabaseField... аннотации.Вот документы для @DatabaseFieldSimple:

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseFieldSimple.html

...