我在ORMLite中遇到外键问题我有2个类QuestionDb和ResponsesDb如下:
public class ResponsesDb {
public static final String FIELD_ID = "id";
@DatabaseField(generatedId = true,columnName=FIELD_ID)
private int id;
@DatabaseField(canBeNull = false, foreign = true, foreignColumnName=QuestionDb.FIELD_REF)
private QuestionDb question;
@DatabaseField(canBeNull = false)
private String answer;
}
并且:
@DatabaseTable(tableName = "question")
public class QuestionDb implements Serializable {
public static final String FIELD_REF = "ref";
private static final long serialVersionUID = 4106020204304605623L;
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(canBeNull = false, unique = true, columnName=FIELD_REF, index=true)
private String ref;
@ForeignCollectionField(foreignFieldName = "question", eager = true)
private ForeignCollection<ResponsesDb> responses;
}
我的问题是当我这样做时:
QueryBuilder<QuestionDb, Integer> questionQuery = helper
.getQuestionDao().queryBuilder();
QueryBuilder<ResponsesDb, Integer> responseQuery = helper
.getResponseDao().queryBuilder();
responseQuery = responseQuery.join(questionQuery);
我接受了:
05-27 12:00:01.577: W/System.err(7272): java.sql.SQLException: Could not find a foreign class model.ormlite.tableClass.ResponsesDb field in class model.ormlite.tableClass.QuestionDb or vice versa
但是,如果我从ResponsesDb中的问题字段注释中删除字段foreignColumnName=QuestionDb.FIELD_REF
,则查询有效。
事实是,当我的程序更新数据库时,id字段可以更改,所以我希望外键是ref。你知道如何解决这个问题吗?
答案 0 :(得分:2)
你可以使用字符串作为外键。你不能做的是定义一个外键,其中foreignColumnName
不是另一个对象的键。
来自ORMLite documentation中的示例:
对于外来对象,只保留帐户中的 id 字段 在Order表中作为列&#34; account_id&#34;。
在这种情况下,您有QuestionDb
:
@DatabaseField(generatedId = true)
private int id;
generatedId
注释意味着这是表的id。将ref
标记为unique
将创建唯一索引,但它不会使其成为候选键。因此,它不能用作另一个表的外键。
简而言之:如果你需要一个字符串外键,那么你可以。只需在引用的表格中定义一个字符串主键。(即删除id
字段并将@DatabaseField(id = true)
放在ref
字段中。
更进一步,更加强大,我不明白你为什么声称:
事实是,当我的程序更新数据库时,id字段可以 变化
插入后,{em> 值 值不会更改。它非常适合用作外键! :)