我在Task和TaskError之間有一個簡單的OneToMany關係。JPA OneToMany關係不會自動填充?
任務映射TaskErrors:當任務被刪除,因此orphanRemoval
@OneToMany(cascade = CascadeType.ALL, mappedBy = "task", orphanRemoval = true)
private List<TaskError> taskErrorCollection;
的TaskErrors應予刪除。
TaskError連接到一個任務:
@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Task task;
當我添加一個TaskError這個代碼不更新任務TaskErrors列表:
TaskError taskError;
// set all taskErrors vars
taskErrorDAO.create(taskError);
所以數據庫包含一行TaskError,而任務中的TaskErrors列表未被填充。很明顯,當我刪除任務時,它會給出一個錯誤: MySQLIntegrityConstraintViolationException:無法刪除或更新父行
我個人需要填寫任務中的TaskError列表嗎?有沒有辦法讓這個列表自動填充? taskErrorDAO.create(taskError)之後的em.flush不起作用。
您能否詳述一下「然而,我不會以長遠的眼光走這條路,而只是相應地更新我的對象引用。」 TaskError中的Cascade.ALL不正確,但我不確定我應該使用哪個其他設置。 TaskError刪除時不應刪除任務。 – BigJ
我已經根據你的要求更新了我的答案。希望現在更清楚。如果添加了這個'Cascade.ALL'是因爲你希望TaskError被傳播到它被賦值的Task中,那麼它就行不通了。JPA明確指出,您有責任管理內存中的關係。 –
我的應用程序使用大約30個關係的50個表。因此,自己更新所有關係將是巨大且容易出錯的。你說一個解決方案就是每次你想使用/獲取你的Task實體時都要打到數據庫。我可以用em.refresh(任務)? – BigJ