在 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
。
我正在尝试在 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
。