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

相關文章
相關標籤/搜索