精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (13)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-09
最后修改:2011-01-09
比如,分出12个表,每个保存一个月的。每个表的字段是一模一样的。区别只是当用户查询时,要选择不同的表。如果配出12个持久化类来,这样的设计太死了。于是想到hibernate能不能自动根据时间先择要操作的表。 研究了一下还真行。 刚开始也看到别人说类似的需求,用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。 因为NamingStrategy只在Hibernate SessionFactory生成时调用一次,以后就不调用了。因此根本不可以在调用时通过它改变持久化类和表名的关系。 后来经过终于找到了:Interceptor 它是hibernate的拦截器。当用户操作数据库时,会把生成的sql先给Interceptor处理一下,然后再去执行。这正给了我修改sql的机会。 这样,只要做一个持久化类,和这12个表中的一个映射。然后做如下的拦截器: 具体实现如下: public class QueryResInterceptor extends EmptyInterceptor { ... public QueryResInterceptor(Date startTime, Date endTime){ ... } public String onPrepareStatement(String sql) { //根据用户的时间替换sql中的表名 return sql; } } 这个拦截器,接收用户的查询时间做为构造参数。然后做为替换sql中表名的依据。 当我执行一个查询的hql时,hql是按映射的持久化类写的。用如下代码获得Session QueryResInterceptor i=new QueryResInterceptor(...); Session sessoin=sessionFactory.openSession(i); 这样再通过这个session执行hql时,表名就自动换成需要的实际表名了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-09
我都不知道hibernate 支持interceptor。。
不过想法确实不错。 |
|
返回顶楼 | |
发表时间:2011-01-09
最后修改:2011-01-09
有需要,可以用一下这个功能。hibernate越用越觉得它很灵活...
|
|
返回顶楼 | |
发表时间:2011-01-10
我靠,hibernate想分表想好久了,正好看到你这个,试试看
|
|
返回顶楼 | |
发表时间:2011-01-11
这个是非常好的东西,值得研究
|
|
返回顶楼 | |
发表时间:2011-01-11
还不知道有这功能,受教了....不过这个需要配置?
|
|
返回顶楼 | |
发表时间:2011-01-11
mayEyeInfo 写道 还不知道有这功能,受教了....不过这个需要配置?
不需要,按我代码里写的方式取Session就行了。 |
|
返回顶楼 | |
发表时间:2011-01-11
其实分表这种东西还是用表分区来实现更好一些~~~
|
|
返回顶楼 | |
发表时间:2011-01-11
最后修改:2011-01-11
aaa5131421 写道 其实分表这种东西还是用表分区来实现更好一些~~~
表分区之前也考虑过。但是,具我了解,表分区是需要维护的,就是说分区不够时,是需要加入新的分区的。而这样做,可以通过一些策略来毕免对数据库的改动。比如循环使用这12个表。当然,这和用户具体需求是相关的。 |
|
返回顶楼 | |
发表时间:2011-01-12
建议还是不要分表的好,我之前就是采用分表的方式,现在发现在进行一些查询统计的时候挺悲剧的,所以建议还是分区比较好,如果你使用的是MYSQL 5.1以上的版本是支持HASH分区的,这样的话就可以不用经常修改数据库的分区了
|
|
返回顶楼 | |