摘要: 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