美文网首页java高级开发
Hibernate 实体动态表名

Hibernate 实体动态表名

作者: 老鼠AI大米_Java全栈 | 来源:发表于2023-01-14 16:52 被阅读0次

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

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

创建拦截器

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

    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;
    }

}

重新创建session

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();
            }
        }

注意

上述代码注释#符号的地方会因为Hibernate的版本的不同而有不同的写法,我这里用的是Hibernate4.x以上的版本,如果用的是Hibernate3.x的读者,直接session.getSessionFactory().openSession(new Interceptor())即可。

相关文章

网友评论

    本文标题:Hibernate 实体动态表名

    本文链接:https://www.haomeiwen.com/subject/ifigcdtx.html