Hibernate 拦截器的使用--动态表名

摘要: jpa有多种实现的方式,可是最多见的仍是采用Hibernate的方式实现,因此为了实现上述的业务,就必须得用到Hibernate的相关特性,在这里,咱们使用Hibernate的拦截器Interceptor,经过Interceptor,将即将执行的sql语句中的表名进行替换。 前言sql

最近公司的核心业务的数据要进行分库分表,咱们代码中ORM采用的是jpa的方式,可是目前面临的一个问题就是,在原先的实体和表的映射关系是固定的状况下,如何用一种优雅的方式在系统运行的过程当中,根据实际的业务须要动态的将实体的表名进行更改。

内容摘要session

jpa有多种实现的方式,可是最多见的仍是采用Hibernate的方式实现,因此为了实现上述的业务,就必须得用到Hibernate的相关特性,在这里,咱们使用Hibernate的拦截器Interceptor,经过Interceptor,将即将执行的sql语句中的表名进行替换。

方式一:在代码中进行替换ide

1.建立拦截器this

public class AutoTableName extends EmptyInterceptor { private String targetName;// 目标表名 private String tableName;// 操做表名code

public AutoTableName() {}

public AutoTableName(String targetName,String tableName) {
    this.targetName= targetName;
    this.tableName= tableName;
}

@Override
public String onPrepareStatement(String sql) {
    sql = sql.replaceAll(targetName, tableName);
    return sql;
}

} 2.从新建立sessionget

Session session= this.em.unwrap(Session.class);
    AutoTableName autoTableName = new AutoTableName("table","table_1");  //替换表名
    session=session.getSessionFactory().withOptions().interceptor(autoTableName).openSession();//#注意
    Transaction tx = null;
    try{
        Model model=new Model ();
        model.setInfo("test");
        tx = session.beginTransaction();
        session.save(gd);
        tx.commit();
    }catch (Exception rbe) {
        rbe.printStackTrace();
        
    }finally {
        if (session != null) {
            session.close();
        }
    }

3.注意it

上述代码注释#符号的地方会由于Hibernate的版本的不一样而有不一样的写法,我这里用的是Hibernate4.x以上的版本,若是用的是Hibernate3.x的读者,直接session.getSessionFactory().openSession(new Interceptor())便可。io

相关文章
相关标签/搜索