在 ORMLite 中使用 id 字段作为外部字段

Using id field as foreign in ORMLite

我正在尝试在 java 中使用 ORMLite,但我 运行 遇到了以下问题。

我的代码是这样的:

@DatabaseTable(tableName = "subscriptions")
public class Subscription {
    @DatabaseField(id = true, index = true, uniqueCombo=true, foreign = true, foreignColumnName = "gcm_id")
    private User user;
    @DatabaseField(id = true, index = true, uniqueCombo=true, foreign = true, foreignColumnName = "id")
    private Category category;
    //other stuff in the class
}

请注意,user 和 category 这两个字段同时标记为 id 和 foreign。我相信这符合我的数据库:

这些字段分别指向 tables 用户和类别。我认为这对于数据库来说是很正常的,但如果我错了请纠正我。

在线

subscriptionDao = DaoManager.createDao(connectionSource, Subscription.class);

我收到这个错误:

Exception in thread "main" java.lang.IllegalArgumentException: Id field user cannot also be a foreign object at com.j256.ormlite.field.FieldType.(FieldType.java:231) at com.j256.ormlite.field.FieldType.createFieldType(FieldType.java:937) at com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:208) at com.j256.ormlite.table.DatabaseTableConfig.fromClass(DatabaseTableConfig.java:146) at com.j256.ormlite.table.TableInfo.(TableInfo.java:53) at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:149) at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:126) at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:105) at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:895) at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:895) at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:70)

错误应该很容易解释,Id 字段用户不能同时是外部对象。但是,我无法在任何地方找到任何关于为什么会这样或如何解决它的信息。如果我的数据库设计正确,它对我来说也没有意义。

如果我替换行

@DatabaseField(id = true, index = true, uniqueCombo=true, foreign = true, foreignColumnName = "gcm_id")
private User user;

有了这些

@DatabaseField(id = true, index = true, uniqueCombo=true)
private User user;

我得到了预期的 "ORMLite does not know how to store class" 错误,但是 我没有得到相同的 Id 字段 _____ 也不能是类别字段的外来对象错误。 如果我为我的用户字段设置 id = false,我只会在类别字段中收到此错误。

一个简单的补丁是为 table 订阅使用生成的 ID,但正如我所说,我正在以这种方式设计我的数据库,因为我被教导最好避免在任何地方生成 ID,特别是在 table 的主键很明显、易于处理、有效等情况下(即当您使用生成的 ID 没有真正获得任何好处时)。

谢谢大家的帮助。

据我所知,问题是你们都有 多个 id 字段,而且它们都是外国的。

根据 id 的文档:

Only one field can have this set in a class

一个非常简单的修复方法是使用如下设计的 table:

@DatabaseTable(tableName = "subscriptions")
public class Subscription {
    @DatabaseField(generatedId = true)
    private int sub_id;
    @DatabaseField(index = true, uniqueCombo=true, foreign = true, foreignColumnName = "gcm_id")
    private User user;
    @DatabaseField(index = true, uniqueCombo=true, foreign = true, foreignColumnName = "id")
    private Category category;
    //other stuff in the class
}

当这些对象被插入数据库时​​,generatedId 字段自动递增 id