【问题标题】:Using id field as foreign in ORMLite在 ORMLite 中使用 id 字段作为外部字段
【发布时间】:2015-07-06 23:28:31
【问题描述】:

我正在尝试在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。我相信这符合我的数据库:

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

上线

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

我收到此错误:

线程“main”中的异常 java.lang.IllegalArgumentException: Id 现场用户也不能是外来对象 com.j256.ormlite.field.FieldType.(FieldType.java:231) 在 com.j256.ormlite.field.FieldType.createFieldType(FieldType.java:937) 在 com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:208) 在 com.j256.ormlite.table.DatabaseTableConfig.fromClass(DatabaseTableConfig.java:146) 在 com.j256.ormlite.table.TableInfo.(TableInfo.java:53) 在 com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:149) 在 com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:126) 在 com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:105) 在 com.j256.ormlite.dao.BaseDaoImpl$4.(BaseDaoImpl.java:895) 在 com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:895) 在 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 不知道如何存储类”错误,但 我没有收到相同的 Id 字段 _____ 也不能是类别字段的外来对象错误。我只有如果我为我的用户字段设置 id = false,则类别字段会出现此错误。

一个简单的补丁是使用生成的 id 进行表订阅,但就像我说的那样,我正在这样设计我的数据库,因为我被教导最好避免在任何地方生成 id,尤其是在主键该表很明显,易于处理,工作等(即当您没有真正从使用生成的 id 获得任何东西时)。

感谢大家的帮助。

【问题讨论】:

    标签: java database ormlite


    【解决方案1】:

    据我所知,问题在于你们都有多个 id 字段并且它们都是外来的。

    根据id 的文档:

    一个类中只有一个字段可以设置此设置

    一个非常简单的解决方法是使用如下设计的表格:

    @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

    【讨论】:

    • 我明白了。谢谢!我试图避免该修复,因为就像我说的那样,我宁愿不在每个表中使用虚构的 id,据我所知,这是一种普遍的不良做法,并且可以掩盖数据库的设计问题。从您的文档引用中,我看到在这种情况下这是不可避免的。感谢您帮助我发现这一点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多