在ORMLite中使用id字段作为外来字符

时间:2015-07-06 23:28:31

标签: java database 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。我相信这符合我的数据库:

database table subscriptions

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

在线

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

我收到此错误:

  

线程“main”中的异常java.lang.IllegalArgumentException:Id   字段用户也不能是异物   com.j256.ormlite.field.FieldType。(FieldType.java:231)at   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)at   com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:149)at at   com.j256.ormlite.dao.BaseDaoImpl。(BaseDaoImpl.java:126)at at   com.j256.ormlite.dao.BaseDaoImpl。(BaseDaoImpl.java:105)at at   com.j256.ormlite.dao.BaseDaoImpl $ 4.(BaseDaoImpl.java:895)at at   com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:895)at 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不知道如何存储类”错误,但我没有得到相同的Id字段_____也不能是类别字段的异物错误。我只如果我为我的用户字段设置了id = false,则会为类别字段获取此错误。

一个简单的补丁就是使用生成的id进行表订阅,但就像我说的那样,我正在设计我的数据库,因为我已经被教过最好避免生成的ID到处都有,特别是在主键的位置。该表是显而易见的,易于处理,工作等(即当你没有真正从使用生成的id获得任何东西时)。

谢谢大家的帮助。

1 个答案:

答案 0 :(得分: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