假设有一个具有结构的用户表:
用户
- 项目清单
- 用户 ID (PK)
- 公司(PK)
- 用户名
- 地址...等
而我只想检索当前公司的用户(用户可以通过UI更改公司,所以公司是运行时参数)
同样,还有许多其他表具有与公共列(公司)相似的结构,并且我想将数据限制为仅当前公司,因此我使用休眠过滤器来过滤数据。
休眠注释:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">Dialect....</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>User</value>
.....
</list>
</property>
</bean>
过滤器定义:
@org.hibernate.annotations.FilterDef(name="restrictToCurrentCompany", 参数 = {@org.hibernate.annotations.ParamDef( 名称 = “currentCompanyNumber”,类型 = “int” ) } ) @实体 @表(名称=“用户”) @org.hibernate.annotations.Filter( name = "restrictToCurrentCompany", 条件="公司 = :currentCompanyNumber" ) 公共类用户实现可序列化{ 私人国际公司; 私人字符串用户名; ...ETC.. }
道:
@Repository @Transactional(readOnly = true) 公共类 UserDAOImpl 实现 UserDAO { @Autowired(必需 = 真) 私人 SessionFactory 会话工厂; 公共设置 getUsers(){ .....检索当前公司用户的条件查询 } 私人会话 getSession(){ 返回 sessionFactory.getCurrentSession(); } }
如果我像这样更改 getSession;
private Session getSession(){
Session session = sessionFactory.getCurrentSession();
Filter filter = session.enableFilter("restrictToCurrentCompany");
filter.setParameter("currentCompanyNumber", UserUtils.getCurrentCompany());
return sessionFactory.getCurrentSession();
}
然后我可以启用过滤器,一切看起来都不错,但是在获取会话期间没有启用过滤器,有没有更简单的替代方法可以为整个会话工厂/应用程序级别应用和启用过滤器?如果是这样,我怎么能使用弹簧配置来做到这一点?
我尝试连接到休眠拦截器(预加载事件侦听器),但我有点不确定这是否是正确的方法,还是我应该使用上面列出的 getSession 方法来启用过滤器?