过滤JPA实体,而不从数据库中删除它们



我有一个数据库表"viewmodule"与FK到自己(parent_id),以允许递归结构。

CREATE TABLE viewmodule (
id,
type,
parent_id,
hide);

我的Java应用程序使用JPA/Hibernate映射该表上的实体。我们有固定的实体层次,这是由@Discriminator注释解决的,该注释使用表的"type"列。

public class ViewModule implements Serializable {
   private long id;
   private String type;
   private ViewModule parent;
   private Boolean hide;
   @OneToMany( targetEntity = ViewModule.class, cascade = javax.persistence.CascadeType.ALL, mappedBy = "parent" )
   @Cascade( { org.hibernate.annotations.CascadeType.ALL,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN } )
   private Set<ViewModules> children;
(...)
}

我现在的任务是从这个表中加载所有元素(在深),但留下那些有字段"隐藏"设置为真。这显然是一个简单的过滤机制。我的第一种方法是使用Hibernate Filter注释,它在第一层(所有parent_id = null的viewmodule)上工作得很好。但是过滤器对"子"关系不起作用。(在我的现实生活模型中,我有不同类型的ViewModules的继承结构)

因此,我写了一个小函数,递归遍历viewModule对象树,并从具有hide=true;

的子关系中删除viewModules。

但是,由于所有对象仍然处于jpa/hibernate entityManager的监视之下,因此每次从集合中删除都会直接在数据库中作为delete执行。因此,我的过滤函数从数据库中删除了实体,这是一件坏事。

我试图从hibernate会话中使用"evict"方法在过滤之前分离实体,但这会导致LazyInitialisationException。

因此,为了防止克隆我的所有对象,我的问题是如何解决这个问题?是否有一种方法来分离对象的方式,所有集合都被初始化?或者是否有一个特殊的功夫Chuck-Norris JPA Annotation可以过滤集合?

Thanks in advance

使用本地查询

em.createNativeQuery("select * from viewmodule where hide = false", ViewModule.class).getResultList();

过滤列表包含在jpa/hibernate查询返回的实体中

创建一个新集合,并只添加具有hide=false的元素。您将无法将该集合与对象一起分发,因此您必须从单独的方法调用中返回它。例如:dao.getVisibleItems(module)

另一件事-你可以删除Cascade。DELETE(即列出除DELETE之外的所有级联)和孤儿删除,如果您不需要它们

最新更新