我在 Task 和 TaskError 之间有一个简单的 OneToMany 关系。
任务映射任务错误:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "task", orphanRemoval = true)
private List<TaskError> taskErrorCollection;
当任务被删除时,TaskErrors应该被删除,因此orphanRemoval。
TaskError 连接到一个任务:
@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Task task;
当我使用以下代码添加任务错误时,任务中的任务错误列表不会更新:
TaskError taskError;
// set all taskErrors vars
taskErrorDAO.create(taskError);
因此数据库包含 TaskError 的一行,而 Task 中的 TaskErrors 列表未填充。显然,当我删除任务时,会出现错误: MySQLIntegrityConstraintViolationException:无法删除或更新父行
我个人是否需要填充任务中的任务错误列表?有没有办法让这个列表自动填充? taskErrorDAO.create(taskError) 之后的 em.flush 没有帮助。
最佳答案
开发人员负责实体关系的内存表示。所以 - 是的,您需要在 Task
TaskError
列表中填充 TaskError
实例。
您可以尝试清理 Task
的 PersistenceContext
缓存并直接从数据库重新获取它,例如:
em.refresh(task);
或
em.clear();
task = em.find(Task.class, yourTaskId);
无论哪种方式,您的 JPA 提供程序都应该清除实体的内存中表示,访问数据库(正如您所说,已正确插入行)以获取它并正确加载列表。但是,从长远来看,我不会这样做,而只是相应地更新我的对象引用。
如果您拒绝更新实体的内存中关系,则无法使用 PersistenceContext
的缓存功能。为了获得正确的数据,在分配任何新的 TaskError
后,每次想要使用/获取 Task
实体时,您都需要访问数据库。
还有一件事 - 为什么 TaskError
中有 Cascade.ALL
?如果移除了 TaskError
,是否要移除 Task
实例?
您还可以查看this resource了解更多信息。
关于JPA OneToMany 关系未自动填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8236833/