[英]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();
創建一個新集合並僅添加hide=false
的元素。 您將無法將該集合與對象一起分發,因此您必須從單獨的方法調用中返回它。 例如: dao.getVisibleItems(module)
另一件事 - 你可以刪除Cascade.DELETE(即列出除刪除之外的所有級聯)和孤立刪除,如果你不需要它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.