对基础实体

时间:2016-02-16 15:57:22

标签: java hibernate

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

我最初想要做的是使用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团队的帖子,这是不可能的:

  

Hibernate数据过滤器不会改变关联的多样性。因此,根据定义,它不会过滤多对一,一对一或任何load()或get()操作。

     

它应该做什么,返回NULL而不是实例? NULL并不意味着FILTERED,它意味着NULL。你们错误地使用过滤器。

所以我的问题是:有没有办法从manyToOne关系(Organization.code =:codeParam)中用实体上的条件过滤基本实体(“Event”)?

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

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

1 个答案:

答案 0 :(得分:0)

警告:不要这样做,它依赖于Hibernate内部,并且容易打破架构更改,并且可能会出现个别查询设置的变化。

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

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

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