gpt4 book ai didi

java - 删除有关 mappedBy 集合的实体时的最佳实践?

转载 作者:行者123 更新时间:2023-11-30 11:59:26 27 4
gpt4 key购买 nike

我仍然不确定哪种是处理 em.remove(entity) 的最佳实践,该实体位于 JPA 中使用 mappedBy 映射的多个集合中。

考虑像 Property 这样的实体引用三个其他实体:DescriptorBusinessObjectLevel 实体。映射是在 Property 实体中使用 @ManyToOne 并在其他三个对象中使用 @OneToMany(mappedBy...) 定义的。之所以定义逆向映射,是因为在某些情况下我需要访问这些集合。

每当我使用 em.remove(prop) 删除属性时,此元素不会自动从其他三种类型的托管实体中删除。如果我不关心这一点,并且接下来的页面加载 (webapp) 不会重新加载那些实体,那么仍然可以找到该属性,并且可能会做出一些不再正确的决定。

逆向映射可能会变得非常大,虽然我不想使用像 descriptor.getProperties().remove(prop) 这样的东西,因为它会加载所有那些可能是惰性的属性加载到那时。

所以我目前首选的方法是刷新实体,如果它被管理:if (em.contains(descriptor)) em.refresh(descriptor) - 它卸载一个可能加载的集合并触发一个下次访问时重新加载。

是否有另一种可行的方法来处理所有那些已加载实体的 mappedBy 集合?

最佳答案

您是检查实体是否受管理的解决方案听起来很棒。

为什么不在实体的@PreRemove 和@PrePersist 上编程呢?这样一来,您只需对其进行一次编程,它就能使您的模型始终保持一致(无需任何手动集合篡改)。

另一种解决方案是始终在更新和插入之后重定向,这会强制您作为 Controller 查询 JPA 而不是使用被操纵的模型对象。

更新:您可能还想查看: JPA implementation patterns

关于java - 删除有关 mappedBy 集合的实体时的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com