我正在尝试在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)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获得任何东西时)。
谢谢大家的帮助。
答案 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
。