使用hibernate拦截器分表 该实例是按月分表

hibernate拦截器:



import com.yourClass;
import org.apache.log4j.Logger;
import org.hibernate.EmptyInterceptor;

import javax.persistence.Table;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 关于  hibernate  的拦截器 拿来做分表吧,暂时 不实现  等有需要的 时候实现 
 * 
 * 
 * */
public class MyInterceptor extends EmptyInterceptor{
   private static Logger logger = Logger.getLogger(MyInterceptor.class);
   private static final long serialVersionUID = 1L;

   private static String name = null;

   @Override
   public String onPrepareStatement(String sql) {
      return super.onPrepareStatement(sqlFilter(sql));
   }
   
   public static String sqlFilter(String sql) {
      if (name == null) {
         Table table = yourClass.class.getAnnotation(Table.class);
         name = table.name();
      }

      if (sql.contains(name)) {
         String regex = "\\$\\{(.+?)\\}";
         Matcher matcher = Pattern.compile(regex).matcher(sql);
         while (matcher.find()) {
            SimpleDateFormat sdf = new SimpleDateFormat(matcher.group(1));//匹配正则
            sql = matcher.replaceAll(sdf.format(new Date()));
         }
      }

      return sql;
   }
}

spr.xml配置

<bean id="myInterceptor" class="MyInterceptor"/>
<bean id="sessionFactory"
      class="db.distributed.SessionFactoryCreator">

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">${sys.show_sql}</prop>
            <prop key="hibernate.format_sql">false</prop>
        </props>
    </property>
    <property name="entityInterceptor" ref="myInterceptor"/>
</bean>

dao实体类

@Repository
public class yourClassHibernate extends DaoSupport<yourClass> implements yourClassDao {
   /**
    * 
    */
   private static final long serialVersionUID = 1L;

   @Override
   public boolean createTable() {
      return getHibernateTemplate().execute(new HibernateCallback<Boolean>() {
         @Override
         public Boolean doInHibernate(Session session) throws HibernateException, SQLException {
            session.doWork(new Work() {
               @Override
               public void execute(Connection connection) throws SQLException {
                  String tableName = yourClass.class.getAnnotation(Table.class).name();
                  String sql = "CREATE  TABLE  " + tableName + "  LIKE  yourClassTableName;";//复制表结构
                  sql = MyInterceptor.sqlFilter(sql);
                  PreparedStatement preparedStatement = connection.prepareStatement(sql);
                  preparedStatement.execute();
                  preparedStatement.close();
               }
            });

            return true;
         }
      });
   }
}
dao接口:

public interface yourClassDao extends Dao<yourClass> {
    boolean createTable();
}

服务层实现类:

@Service
public class yourClassServiceImpl extends ServiceSupport<yourClass> implements yourClassService {
   /**
    * 
    */
   private static final long serialVersionUID = 1L;
   /**
    * 
    */
   @Autowired
   yourClassDao dao;
   
   public boolean saveOrUpdate(yourClass t) {
      boolean result = false;
      try {
         t.setCreateTime(new Date());
         result = dao.saveOrUpdate(t);
      } catch (RuntimeException e) {
         Throwable tr = e;
         while (tr.getCause() != null) {
            tr = tr.getCause();
         }
         if (Pattern.compile("Table '.*' doesn't exist").matcher(tr.getMessage()).matches()) {
            dao.createTable();
         }
         throw e;
      }
      return result;

   }
}
action里的调用:

try {
   yourClassService.saveOrUpdate(yourClass);
}catch (Exception e) {
   logger.info("create yourClassTableName table");
   yourClassService.saveOrUpdate(yourClass);
}

yourClass:

@Entity
@Table(name = "yourClassTableName_${yyyyMM}")
@Level(Level.TYPE.PRIVATE)
@org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true)
public class youClassName extends AbstractItem implements ItemBase {}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值