Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除有关mappedBy集合的实体时的最佳做法?_Java_Jpa_Mapping - Fatal编程技术网

Java 删除有关mappedBy集合的实体时的最佳做法?

Java 删除有关mappedBy集合的实体时的最佳做法?,java,jpa,mapping,Java,Jpa,Mapping,我仍然不确定处理em.remove(entity)的最佳实践是什么,该实体位于使用JPA中的mappedBy映射的多个集合中 考虑一个像属性这样的实体,它引用了三个其他实体:一个描述符、一个业务对象和一个级别实体。映射在属性实体中使用@manytone,在其他三个对象中使用@OneToMany(mappedBy…)进行定义。之所以定义反向映射,是因为在某些情况下,我需要访问这些集合 每当我使用em.remove(prop)删除属性时,该元素不会自动从其他三种类型的托管实体中删除。如果我不关心这个

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

考虑一个像
属性
这样的实体,它引用了三个其他实体:一个
描述符
、一个
业务对象
和一个
级别
实体。映射在属性实体中使用
@manytone
,在其他三个对象中使用
@OneToMany(mappedBy…
)进行定义。之所以定义反向映射,是因为在某些情况下,我需要访问这些集合

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

反向映射可能会变得非常大,尽管我不想使用类似于
descriptor.getProperties().remove(prop)
的东西,因为它将加载所有那些在此之前可能是延迟加载的属性

因此,我当前首选的方法是在实体被管理时刷新它:
if(em.contains(descriptor))em.refresh(descriptor)
——它卸载可能加载的集合,并在下次访问时触发重载


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

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

为什么不在实体的@PreRemove和@PrePersist上编程呢?这样,您只需对其编程一次,就可以使您的模型始终保持一致(没有任何手动篡改)

另一种解决方案是在更新和插入之后总是重定向,这迫使您的控制器查询JPA,而不是使用操纵的模型对象

更新: 您可能还想签出:

谢谢你的想法。使用持久性事件对我来说可能有点棘手,因为到目前为止,我的模型并没有引用entitymanager本身,而是在Seam上下文中使用的—刷新方式可能不会以这种方式工作。关联集合上的add()/remove()对于大型集合来说太昂贵了。我接受了该解决方案,因为它或多或少批准了我当前的实现。在某些情况下,持久化事件的想法是好的和有用的。