gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:11 26 4
gpt4 key购买 nike

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

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

我的 Java 应用程序使用 JPA/Hibernate 映射该表上的实体。我们有固定的实体 hirachy,它通过使用表的“类型”列的 @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 注释,它在第一层(所有 parent_id = null 的 View 模块)上运行良好。但过滤器不适用于“ child ”关系。 (在我的现实生活模型中,我有不同类型的 ViewModules 的继承结构)

因此我编写了一个小函数,它递归遍历 viewModule 对象树并从具有 hide=true 的子关系中删除 viewModules;

但是,由于所有对象仍在 jpa/hibernate entityManager 的观察下,从集合中删除的每个对象都直接作为数据库中的删除执行。所以我的过滤器函数从数据库中删除了实体,这是一件坏事。

我尝试使用 hibernate session 中的“逐出”方法在过滤之前分离实体,但这会导致 LazyInitialisationException。

所以,为了防止克隆我的所有对象,我的问题是如何解决这个问题?有没有办法以初始化所有集合的方式分离对象?还是有专门的 Kung-Fu Chuck-Norris JPA Annotation 可以过滤集合?

提前致谢

最佳答案

使用原生查询

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

这有效:Filter list contained in entity returned by jpa/hibernate query

关于java - 过滤 JPA 实体而不从数据库中删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6841656/

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