java - 基本实体上的 Hibernate manyToOne 过滤器

标签 java hibernate

我有一个实体“事件”,它与实体“组织”具有多对一关系。因此一个组织可以有多个事件。

我最初想做的是使用 Organization 实体的属性来过滤实体 Event。所以基本上当我获取事件时,只返回具有 Organization.code= :codeParam 的事件。

为了实现这一点,我实现了一个 hibernate 过滤器:

@FilterDef(name="codeFilter", parameters=@ParamDef( name="codeParam", type="string" ) )

...

@ManyToOne
@JoinColumn(name="Organization_Id")
@Filter(name="codeFilter", condition=" code = :codeParam")
private Organization organization;

...

Filter hibernateFilter = sess.enableFilter("codeFilter");
hibernateFilter.setParameter("codeParam", "hola");

不幸的是,根据 Hibernate 团队在 hibernate 论坛上的帖子,这是不可能的:

A Hibernate data filter does not change the multiplicity of an association. By definition it therefore does not filter many-to-one, one-to-one, or any load() or get() operation.

What is it supposed to do, return NULL instead of an instance? NULL does not mean FILTERED, it means NULL. You guys are using filters wrong.

所以我的问题是:是否有任何方法可以通过多对一关系 (Organization.code= :codeParam) 中的实体条件来过滤基本实体(“事件”)?

我需要在每次获取事件时强制执行此操作,因此非常感谢使用现有的 hibernate 过滤器或类似工具的解决方案。

EDIT1:这个问题是一个简单的例子,说明需要在更大范围内完成什么。基本上,我们希望通过在我们所有表都具有的 Unix 权限行上使用全局定义的过滤器来为我们所有的实体和它们自己的嵌套实体添加安全性。

最佳答案

警告:不要这样做,它依赖于 Hibernate 内部结构,并且容易因模式更改而中断,并且可能因单个查询设置的变化而中断。

设置 Hibernate 以显示其生成的 sql,运行您要过滤的查询(在本例中,加载一些 Event 对象),并检查它分配给用于获取相关联的连接的名称组织。例如,生成的 sql 可能包含 inner join Organization someNameHere on this_.Organization_Id = someNameHere.OrganizationId。然后应用过滤器,不是对关联,而是对 Event 类,条件为 "someNameHere.code = :codeParam"

不幸的是,这是我能够找到的通过关联类的属性过滤一个类的唯一方法。

我正在尝试制定更强大的解决方案,但这是一个复杂的问题,我仍处于研究阶段。我预计它将使用代码生成(通过注解处理器)和在启动时以编程方式修改 Hibernate 的映射信息,但我不确定还有什么。

关于java - 基本实体上的 Hibernate manyToOne 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35437164/

相关文章:

hibernate - 减少退出Service方法返回Controller方法的处理时间

Java - 填充自定义形状

java - Byte-buddy:生成具有循环类型的类

java - 使用资源构建java库

java - Hibernate/JPA 合并后获取数据库中具有默认值的列的值

hibernate - Grails单向多对一和标准

java - 将 aws-java-sdk 添加到 pom 时,@JsonIgnore 不起作用。为什么?

java - 选择 JCombobox 时 GUI 卡住,如何在 ActionListener 中使用条件语句在 Swing 应用程序中使用计时器?

java - 创建对象实例而不调用父类(super class)构造函数

hibernate - JPA/Hibernate 同一实体的多种表示