★ why the filter doesn't work on

AACM 2006-09-15 11:11:39
Hibernate version : 3.0

why the filter doesn't work on <many-to-one> ?

All the tables in my database have a visibility flag so that queries will only retrieve objects that are not hidden. I'm successfully using Hibernate Filters at class level and collection level

My problem is that I can't see any way to apply the same filter to a nested object that is declared by a many-to-one element in the mapping file.


<hibernate-mapping>
<class name="User" table="USER">
....
<many-to-one name="group"
type="group"
column="GROUP_ID" />
....

<filter name="visiblefilter" />
</class>

<class name="Group" table="GROUP">
....

<filter name="visiblefilter" />
</class>


<filter-def name="visiblefilter">
visible = '1'
</filter-def>

</hibernate-mapping>


Session s = sessionFactory.openSession();
String stmt = "from User u where u.id= '1116'";
s.enableFilter("visiblefilter");

List list = s.createQuery(stmt).list();
User user = (User)list0.get(0);
Group group = user.getGroup(); // <-------- here !
......

the filter doesn't work on group.

the sql is
select ....
from Gourp g_
where g_id = ?

but not

select ....
from Gourp g_
where g_id = ? and visible = '1'

Any help is greatly appreciated.
...全文
186 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmzsl 2006-09-15
  • 打赏
  • 举报
回复
i don't know.
tcmis 2006-09-15
  • 打赏
  • 举报
回复
studing..
AACM 2006-09-15
  • 打赏
  • 举报
回复
To: Saro

这样显式的查询在这里是可以的。
但是在实际的开发中,不是很可能,因为这样的情况是很多的。
这样取值不是很方便,也不够oo

这个问题真是麻烦呀,我觉得以前好像可以过滤的。
这两天偶然发现不行了,奇怪呀。
Saro 2006-09-15
  • 打赏
  • 举报
回复
我试了试。应该是不行的

开始还以为是lazy的问题,但把"from User u where u.id= '1116' "改成"from User u join fetch u.group where u.id= '1116' " 也是无用的.....

你这个需求,hql改成 join fetch u.group g where u.id= '1116' and g.visible=1
不就成了么,如果需要lazy load many端,想想就知道是不可能的
或者这样?

List list = s.createQuery(stmt).list();
User user = (User)list0.get(0);
Group group = (Group )session.load(Group.class,user.getGroup().getId();

多打几个字母而已,一样发送2条sql。
AACM 2006-09-15
  • 打赏
  • 举报
回复
To: Saro

<class name="User" table="USER" where="isValid = 1 " >

这个应该还支持,但是我还有其他的需求,就是那个值需要传进去。
就是有时候 isValid="1" ,有时候isValid="0".

哥们再帮我想想。
AACM 2006-09-15
  • 打赏
  • 举报
回复
大家真是好人呀,我在hibernate.org的论坛上问,没个人理我的,我真是太感动了,谢谢大伙!
我检讨,以后不发e文了。言归正传。

To:haoxiangni()
lazy = false 我试过了,不行。

To:村长
Region region = (Region)session.get(Region.class, “EMEA”);
Region.getOpportunities().size;
这样拿出来的是对的.

但是反过来,
Opportunity.getRegion() , 好像过滤器就不起作用了。

大伙们有空再帮忙看看。

Saro 2006-09-15
  • 打赏
  • 举报
回复
你这种情况,用如下方法难道不更方便?hibernate2.x就有的。

<class name="User" table="USER" where="isValid = 1 " >


javapassion 2006-09-15
  • 打赏
  • 举报
回复
PS:LZ以后别发英文了,呵呵,真没看明白,是用金山翻译了个大概意思看的!呵呵
javapassion 2006-09-15
  • 打赏
  • 举报
回复
才看到,等会儿要去开会,发个many-to-one加Filter的例子,LZ先研究着:

<filter-def name=”accessLevel”>
<filter-param name=”userLevel” type=”int”/>
</filter-def>

<class name=”Opportunity” …>

<many-to-one name=”region” column=”region_id” class=”Region”/>
<property name=”amount” type=”Money”>
<column name=”amt”/>
<column name=”currency”/>
</property>
<property name=”accessLevel” type=”int” column=”access_lvl”/>

<filter name=”accesssLevel” condition=”: userLevel >= access_lvl”/>
</class>

<class name=”Region” …>

<set name=”opportunities” lazy=”true”>
<key column=”region_id”/>
<one-to-many class=”Opportunity”/>
<filter name=”accessLevel” condition=”: userLevel >= access_lvl”/>
</set>
</class>
====================================================================
User user = ….;
Session session = ….;
session.enableFilter(“accessLevel”).setParameter(“userLevel”, user.getAccessLevel());
...
Region region = (Region)session.get(Region.class, “EMEA”);
Region.getOpportunities().size;
haoxiangni 2006-09-15
  • 打赏
  • 举报
回复
在many-to-one标签中加一个属性:lazy=false
gongzhy 2006-09-15
  • 打赏
  • 举报
回复
学习,顶一下
AACM 2006-09-15
  • 打赏
  • 举报
回复
谢谢大家的帮忙。

村长这样好像也不行。

我把我的问题再阐述一下:
1. 我的每个表中都有一个isValid字段,控制这条记录是否有效。若无效就相当于是删除的数据
2. User 和 Group 是 n对1 的关系。

我在映射文件里都设置了过滤,只显示isValid='1'数据。过滤器除了对 n对1 (<many-to-one>)的关系不起作用,其他的过滤都正常(<many-to-many>等都可以)。

比如:
User user = (User) session.get(User.class, new Integer(1));
后台的sql:select .... from User u_ where u_.id = ? and visible = '1' // 正常

但是:Group group = user.getGroup();
后台的sql:select .... from Gourp g_ where g_.id = ? // 过滤不起作用

就是说少了 and visible = '1' ,过滤器没有起作用。

谢谢!
javapassion 2006-09-15
  • 打赏
  • 举报
回复
PS to realyigo(可爱的小强强):
Hibernate Filter是Hibernate3新增的一种特性,提出允许在类或集合中,预定义过滤标准,即Criteria.预定义过滤标准类似"where"的属性,能够给类和各种集合元素定义一个限定条件.
javapassion 2006-09-15
  • 打赏
  • 举报
回复
我英语不好(四级没过),见谅:
我的猜测:AACM (大西)的这个Hibernate Filter的功能可能是安全性过滤,也就是说,特定的用户(User)在访问时拥有不同权限,即归于不同的权限组(Group).

这里的确是应该使用many-to-one进行操作,我建议的定义如下:
定义过滤器:
<filter-def name="accessLevel">
<filter-param name="userLevel" type="int" />
</filter-def>

<class name="User" table="USER">
...
<many-to-one name="group"
type="group"
column="GROUP_ID" />
...
<filter name="accessLevel" condition=":userLevel = group"/>
</class>
<class name="Group" table="GROUP">
...
<filter name="accessLevel" condition=":userLevel = XXX(对应的列)"/>
...
</class>

DAO类:
Group group = ...;
Session session = ...;
session.enableFilter("accessLevel").setParameter("userLevel", group.getXXX());//获取访问权限
User user = (User) session.get(User.class, new Integer(1));
user.getXXX();//获取访问权限
realyigo 2006-09-15
  • 打赏
  • 举报
回复
你的hibernate是什么版本啊?
我在2.1的api里面怎么找不到session的enableFilter方法啊。
imA 2006-09-15
  • 打赏
  • 举报
回复
sorry

67,542

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧