添加 oneToMany 关系时是否需要保存两个实体?
Do I need to save both entities when adding a oneToMany relationship?
TL;DR:在拥有实体上调用 repository.save()
是否足以维持关系,还是我需要保存两个实体?
假设我有两个实体,A
和 B
以及它们之间的 oneToMany 关系。 A
可以有多个 B
,B
可以有一个 A
。 B
是关系的拥有方(有外键)。如果我有两个已经持久化的实体并且想要添加并持久化它们之间的关系,那么我通常会这样做:
a.addB(b);
b.setA(a);
bRepository.save(b);
我的问题是,我还需要打电话给aRepository.save(a)
吗?提前致谢,谷歌搜索没有帮助我找到答案。
好问题,假设您已经保存了 A 实体,答案应该是您不需要再次保存 parent A 实体,因为您已经将 child 实体 B 添加到A 的 children yourself 和 A 的列表已经被持久化了。
如果您重新加载 A 及其所有 children,您应该会得到与当前相同的列表。
因为它是延迟加载的,所以你的查询应该在你想要的情况下专门加载 children ,否则你可能会遇到这样的情况,你假设 A 拥有它的所有 children 但是如果您在没有获取它们的情况下从数据库重新加载 A,则不会。
总的来说,我不得不质疑为什么你首先要保留 A。缓存可能是一件好事,但您的缓存应该在 A 的 children 更新时刷新 A,并且如果需要的话,应该获取 A 的所有 children。在那种情况下,您不需要自己将新的 child 添加到 A b/c 中,它无论如何都会被覆盖。可能不会有什么坏处,但为什么要二次猜测缓存?
更普遍的模式是简单地保存 B 并完成它。如果您的代码需要 A 及其所有 children,它应该在需要时从数据库中获取。
这些想法不包括 JPA 实体缓存,因为我没有尝试深入了解它的具体细节。
如果正如您所描述的那样,该关系归 B
所有,那么就 JPA 而言,A
根本没有改变。所以它不需要持久化。
如果您在当前会话中坚持或加载了 A
和 B
,技术上根本不需要 save
。 JPA 会跟踪实体,注意它们已更改并将在事务结束时将更改刷新到数据库。
TL;DR:在拥有实体上调用 repository.save()
是否足以维持关系,还是我需要保存两个实体?
假设我有两个实体,A
和 B
以及它们之间的 oneToMany 关系。 A
可以有多个 B
,B
可以有一个 A
。 B
是关系的拥有方(有外键)。如果我有两个已经持久化的实体并且想要添加并持久化它们之间的关系,那么我通常会这样做:
a.addB(b);
b.setA(a);
bRepository.save(b);
我的问题是,我还需要打电话给aRepository.save(a)
吗?提前致谢,谷歌搜索没有帮助我找到答案。
好问题,假设您已经保存了 A 实体,答案应该是您不需要再次保存 parent A 实体,因为您已经将 child 实体 B 添加到A 的 children yourself 和 A 的列表已经被持久化了。
如果您重新加载 A 及其所有 children,您应该会得到与当前相同的列表。
因为它是延迟加载的,所以你的查询应该在你想要的情况下专门加载 children ,否则你可能会遇到这样的情况,你假设 A 拥有它的所有 children 但是如果您在没有获取它们的情况下从数据库重新加载 A,则不会。
总的来说,我不得不质疑为什么你首先要保留 A。缓存可能是一件好事,但您的缓存应该在 A 的 children 更新时刷新 A,并且如果需要的话,应该获取 A 的所有 children。在那种情况下,您不需要自己将新的 child 添加到 A b/c 中,它无论如何都会被覆盖。可能不会有什么坏处,但为什么要二次猜测缓存?
更普遍的模式是简单地保存 B 并完成它。如果您的代码需要 A 及其所有 children,它应该在需要时从数据库中获取。
这些想法不包括 JPA 实体缓存,因为我没有尝试深入了解它的具体细节。
如果正如您所描述的那样,该关系归 B
所有,那么就 JPA 而言,A
根本没有改变。所以它不需要持久化。
如果您在当前会话中坚持或加载了 A
和 B
,技术上根本不需要 save
。 JPA 会跟踪实体,注意它们已更改并将在事务结束时将更改刷新到数据库。