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

简介:

前言

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

内容摘要

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

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

1.创建拦截器

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

}

2.重新创建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();
            }
        }

3.注意

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

目录
相关文章
|
Java 数据库连接 数据库
Hibernate 中出现表名(XXX) is not mapped 问题
Hibernate 中出现表名(XXX) is not mapped 问题,检查以下3个原因
547 0
Hibernate 中出现表名(XXX) is not mapped 问题
|
4月前
|
SQL Java 数据库连接
Hibernate出现表名is not mapped问题
要注意的是,这里的==spkbkt_nc_account_v2==在此处不是你数据库对应的表名,也不是你的映射文件的表名,而是你的实体对象的名称(是区分大小写的!必须与实体类名一致)。
|
Java 数据库连接 开发者
Springboot整合Hibernate拦截器EmptyInterceptor
Springboot整合Hibernate拦截器EmptyInterceptor
|
数据库 Java 数据库连接
Hibernate 动态表名映射(数据库分表) NamingStrategy
NamingStrategy接口很有意思,可以作为业务类规范和数据库表规范的桥梁,例如一个数据对象User,对应数据库表是 T_USER,如果所有映射关系都是这样的情况,可以使用NamingStrategy做为一个桥梁衔接,当然你也可以在hbx.xml配置文件中指定 class对应的table.   hibernate.cfg.xml代码就省略了...   User.hbx.xml代码 &
4672 0
|
4月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
1月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
29 1
|
20天前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
30 0
|
2月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
47 0
|
3月前
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
55 0
|
3月前
|
Java 数据库连接
杨老师课堂之JavaEE三大框架Hibernate入门第一课
杨老师课堂之JavaEE三大框架Hibernate入门第一课
24 0