Hibernate PluginInterceptor


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拦截下来进行重新组装,那么接下来的过程根据业务的场景,就能进行不同的封装处理。

相关推荐