我有一个Language
实体,其ForeignCollection为Country
个实体:
@ForeignCollectionField(eager = false, foreignFieldName = "language")
public ForeignCollection<Country> countries;
我在我的数据库中创建了一个代表法国的国家/地区。后来,我通过查询它的id检索它,我想将它添加到Language的国外国家集合中:
Country country = dbHelper.getCountryDao().queryForId(countryId);
if (country != null) {
country.language = language;
ForeignCollection<Country> countries = language.countries;
if (countries == null) {
countries = dbHelper.getLanguageDao().getEmptyForeignCollection("countries");
}
countries.add(country); // Illegal state exception thrown here
language.countries = countries;
dbHelper.getLanguageDao().create(language);
}
但是,标记的行countries.add(country)
会导致抛出非法状态异常:
01-27 13:39:19.112:E / AndroidRuntime(15614):引起: java.sql.SQLException:插入数据库失败:INSERT INTO
countries
(identifier
,name
,language_id
)价值观(?,?,?) 01-27 13:39:19.112:E / AndroidRuntime(15614):at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
为什么.add()
会触发数据库和内部DAO中存在的实体的重新创建?我该怎么做呢?
答案 0 :(得分:6)
为什么.add()会触发数据库和内部DAO中存在的实体的重新创建?
这样做是因为它就是这样设计的。引用javadocs for EagerForeignCollection#add()
:
向集合中添加元素。这也会将项目添加到关联的数据库表中。
表中已存在该国家/地区,因此会抛出异常。您可以通过执行以下操作将现有国家/地区与语言相关联:
country.language = language;
dbHelper.getCountryDao().update(country);
然后,如果您想用您所使用的语言刷新您的热切集合:
dbHelper.getLanguageDao().refresh(language);
答案 1 :(得分:2)
现在我得到一个SQL异常,如果我已经将已创建的元素添加到集合中,因为集合实现的dao.create()
中有add()
。但是很长一段时间我们得到了一个dao.createOrUpdate()
方法,这对于这种情况更好,因为如果我们在集合中已经创建了一个实体,它会进行更新或者什么都不做。是否可以在源代码中更改此内容?
顺便说一下,已经完成并关闭的票证(#31)包含应该自动设置集合元素上的父字段值的更改。但即使在4.45中,我仍然需要手动执行此操作。我错过了什么或可能做错了吗?