Hibernate PluginInterceptor
因公司的有些项目采用hibernate的ORM框架,并且遗留下来的数据越来越多,势必需要备份或者分表,hibernate本身不支持对于分库分表的共享操作,google公司开源一个共享组件,地址:https://github.com/hibernate/hibernate-shards
现有公司的方式,采用同库水平分表的方式,那采用的分表条件是时间+其它条件,主要按时间维度进行分表,那么同样tb_user表,变为tb_user2012、tb_user2013...
import org.hibernate.EmptyInterceptor; import org.hibernate.Session; public class MCSInterceptor extends EmptyInterceptor { private static final long serialVersionUID = -878697113286355810L; public String onPrepareStatement(String sql) { String replaceSql = sql; if (sql.contains("tb_user")) { replaceSql = sql.replace("tb_user", "tb_user_bak"); } return replaceSql; } public void setSession(Session session) { // TODO Auto-generated method stub } }
spring:
<bean id="mcsInterceptor" class="ewell.dao.interceptor.MCSInterceptor"></bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="entityInterceptor"> <ref bean="mcsInterceptor" /> </property> <property name="hibernateProperties"> <props> <!-- 数据库方言 --> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <!-- 是否显示sql语句 --> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.jdbc.batch_size">0</prop> </props> </property> <!-- 映射实体 --> <!-- Spring自动扫描指定的路径下的映射类 --> <property name="packagesToScan"> <list> <value>ewell.bean.*</value> </list> </property> </bean>
其实操作就是在jdbc中preparestatment时候,把sql拦截下来进行重新组装,那么接下来的过程根据业务的场景,就能进行不同的封装处理。