2

Task と TaskError の間に単純な OneToMany 関係があります。

タスクは TaskErrors をマップします。

@OneToMany(cascade = CascadeType.ALL, mappedBy = "task", orphanRemoval = true)
private List<TaskError> taskErrorCollection;

タスクが削除されたときに TaskErrors を削除する必要があるため、orphanRemoval です。

TaskError は Task に接続されています:

@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Task task;

次のコードで TaskError を追加しても、Task の TaskErrors のリストは更新されません。

TaskError taskError;
// set all taskErrors vars
taskErrorDAO.create(taskError);

そのため、データベースには TaskError の行が含まれていますが、Task の TaskErrors のリストにはデータが入力されていません。明らかに、タスクを削除すると、エラーが発生します: MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row

Task に TaskError リストを入力する必要がありますか? このリストを自動的に作成する方法はありますか? taskErrorDAO.create(taskError) の後の em.flush は役に立ちません。

関係

4

1 に答える 1

4

開発者は、エンティティの関係をメモリ内で表現する責任があります。TaskErrorつまり、-はい、インスタンスをTask TaskErrorのリストに入力する必要があります。

PersistenceContextキャッシュをクリーンアップしTaskてデータベースから直接再フェッチしてみると、次のようになります。

em.refresh(task);

また

em.clear();
task = em.find(Task.class, yourTaskId);

いずれにせよ、JPAプロバイダーは、エンティティーのメモリー内表現をクリアし、データベース(あなたが言ったように、行を正しく挿入している)にヒットして、それをフェッチし、リストを適切にロードする必要があります。ただし、長期的な観点からはこのように進むのではなく、それに応じてオブジェクト参照を更新するだけです。
エンティティのメモリ内の関係を更新することを拒否した場合は、のキャッシュ機能を使用できませんPersistenceContextTask正しいデータを取得するには、新しいエンティティTaskErrorが割り当てられた後、エンティティを使用/フェッチするたびにデータベースにアクセスする必要があります。

もう1つ-なぜあなたはCascade.ALLにいるのTaskErrorですか?Taskが削除された場合、インスタンスを削除しますTaskErrorか?

詳細については、このリソースを確認することもできます。

于 2011-11-23T09:11:54.353 に答える