簡體   English   中英

過濾JPA實體而不從數據庫中刪除它們

[英]Filter JPA Entities without removing them from database

我有一個數據庫表“viewmodule”與自己的FK(parent_id),以允許遞歸結構。

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

我的Java應用程序使用JPA / Hibernate映射該表上的實體。 我們有固定實體hirachy,它由使用表的“type”列的@Discriminator注釋解決。

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;
(...)
}

我的任務是加載此表中的所有元素(深層)但忽略了將“hide”字段設置為true的元素。 它是一個看似簡單的過濾機制。 我的第一種方法是使用Hibernate Filter注釋,它在第一層上運行良好(所有viewmodules都使用parent_id = null)。 但過濾器不適用於“子”關系。 (在我的現實生活模型中,我有一個不同類型的ViewModules的繼承結構)

因此,我編寫了一個小函數,以遞歸方式遍歷viewModule對象樹,並從具有hide = true的子關系中刪除viewModule;

但是,由於所有對象仍在觀察jpa / hibernate entityManager,因此每次從集合中刪除都會在數據庫中直接執行為delete。 所以我的過濾器函數從數據庫中刪除了實體,這是一件壞事。

我嘗試使用hibernate會話中的“evict”方法在過濾之前分離實體,但這會導致LazyInitialisationException。

所以,為了防止克隆我的所有對象我的問題是如何解決這個問題? 有沒有辦法以初始化所有集合的方式分離對象? 或者是否有一個特殊的Kung-Fu Chuck-Norris JPA Annotation可以過濾收藏品?

提前致謝

使用本機查詢

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

這有效: jpa / hibernate查詢返回的實體中包含的過濾列表

創建一個新集合並僅添加hide=false的元素。 您將無法將該集合與對象一起分發,因此您必須從單獨的方法調用中返回它。 例如: dao.getVisibleItems(module)

另一件事 - 你可以刪除Cascade.DELETE(即列出除刪除之外的所有級聯)和孤立刪除,如果你不需要它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM