转:http://www.iteye.com/topic/866142
我参与的某项目出现了一个这样的需求。用户的每个月的数据库很大 >1000W。用户需要针对每个月做查询。为了加快用户的查询速度,这里打算按月分表存数据。怎么用hibernate实现这个功能呢。
比如,分出12个表,每个保存一个月的。每个表的字段是一模一样的。区别只是当用户查询时,要选择不同的表。如果配出12个持久化类来,这样的设计太死了。于是想到hibernate能不能自动根据时间先择要操作的表。
研究了一下还真行。
刚开始也看到别人说类似的需求,用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。
因为NamingStrategy只在Hibernate SessionFactory生成时调用一次,以后就不调用了。因此根本不可以在调用时通过它改变持久化类和表名的关系。
后来经过终于找到了:Interceptor
它是hibernate的拦截器。当用户操作数据库时,会把生成的sql先给Interceptor处理一下,然后再去执行。这正给了我修改sql的机会。
这样,只要做一个持久化类,和这12个表中的一个映射。然后做如下的拦截器:
具体实现如下:
Java代码
public class QueryResInterceptor extends EmptyInterceptor {
...
public QueryResInterceptor(Date startTime, Date endTime){
...
}
public String onPrepareStatement(String sql) {
//根据用户的时间替换sql中的表名
return sql;
}
}
这个拦截器,接收用户的查询时间做为构造参数。然后做为替换sql中表名的依据。
当我执行一个查询的hql时,hql是按映射的持久化类写的。用如下代码获得Session
Java代码
QueryResInterceptor i=new QueryResInterceptor(...);
Session sessoin=sessionFactory.openSession(i);
这样再通过这个session执行hql时,表名就自动换成需要的实际表名了。
分享到:
相关推荐
下面小编就为大家带来一篇spring hibernate实现动态替换表名(分表)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL
使用拦截器时按如下步骤进行: (1)定义实现Interceptor接口的拦截器类 (2)通过Session启用拦截器,或者通过Configuration启用全局拦截器请看示例代码
使用hibernate对sqlserver 2005进行增删改查
让hibernate输出sql语句参数配置.doc
基于JavaWeb实现的图书管理系统(struts+spring+hibernate+SQL Server) 基于JavaWeb实现的图书管理系统(struts+spring+hibernate+SQL Server) 基于JavaWeb实现的图书管理系统(struts+spring+hibernate+SQL Server) ...
基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于spring实现的网上订餐系统(struts+spring+hibernate+SQL Server) 基于...
不错的分页(Hibernate+sqlserver2000分页)值得大家一看。
NULL 博文链接:https://elfasd.iteye.com/blog/1770847
模仿Hibernate生产SQL语句,使用Java反射
hibernate中使用sql 而不是hql语句
hibernate执行原生sql语句
NULL 博文链接:https://ynp.iteye.com/blog/2007053
对于初学者是一个很好的案例。java+hibernate+sql +jsp框架整合的小型开发系统。里面只是源代码。
Hibernate+本地SQL查询SQLQuery宣贯.pdf
hibernate 连接 sql server 所需的jar包 msbase.jar msutil.jar mssqlserver.jar
使用Hibernate编写通用数据库操作代码
NULL 博文链接:https://ajita.iteye.com/blog/1418557
Struts 1.1、Hibernate 3.0和SQL Server 2005数据库驱动包
这里是hibernate增删查改和采用freemarker实现动态sql,hql