JPA OneToMany 关系未自动填充?

标签 jpa entity one-to-many populate relation

我在 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 没有帮助。

relation

最佳答案

开发人员负责实体关系的内存表示。所以 - 是的,您需要在 Task TaskError 列表中填充 TaskError 实例。

您可以尝试清理 TaskPersistenceContext 缓存并直接从数据库重新获取它,例如:

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/

相关文章:

Symfony2 - 存储库中的getParameter

java - Eclipse 中单独 JAR 中的 JPA @MappedSuperclass 导致验证错误 "The entity has no primary key attribute defined"

java - 持久化实体时出错 : subquery in FROM must have an alias

mysql - JPA一对多删除并将外键设置为null

Hibernate 将重复项插入到 @OneToMany 集合中

java - hibernate @OneToMany错误: Duplicate entry '0' for key 'PRIMARY'

java - 在 Spring 3.2.5 中使用 EclipseLink(Pet Clinic 项目)

java - JPA请求问题: Validation failed for query for method public abstract java. util.List

Java REST boolean 字段的部分更新

java - 将 FetchType 更改为 LAZY 后,未发现空 beans 错误的序列化程序