3

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 に存在するエンティティの再作成をトリガーするのはなぜですか? そして、代わりに何をすべきですか?

4

2 に答える 2

6

.add() がデータベースと内部 DAO に存在するエンティティの再作成をトリガーするのはなぜですか?

これは、そのように設計されているためです。のjavadocEagerForeignCollection#add()を引用するには:

コレクションに要素を追加します。これにより、関連するデータベース テーブルにもアイテムが追加されます。

国はテーブルに既に存在するため、例外がスローされます。次のようにして、既存の国を言語に関連付けることができます。

country.language = language;
dbHelper.getCountryDao().update(country);

次に、言語で熱心なコレクションを更新する場合は、次のようにします。

dbHelper.getLanguageDao().refresh(language); 
于 2013-01-27T16:01:57.967 に答える
2

コレクションの実現のdao.create()ために、既に作成された要素をコレクションに追加すると、現在、SQL 例外が発生します。add()しかし、かなり長い間、dao.createOrUpdate()メソッドを取得しました。これは、コレクションに既に作成されたエンティティがある場合、更新を行うか、単に何もしないため、この状況に適しています。ソースコードでこれを変更することは可能ですか?

ちなみに、コレクション要素の親フィールド値を自動的に設定する必要がある変更を含む、既に完了してクローズされたチケット ( #31 ) があります。しかし、4.45 でも手動で行う必要があります。私は何かを見逃したのですか、それとも何か間違ったことをしたのでしょうか?

于 2013-04-01T23:02:31.693 に答える