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