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 数据库连接 开发者
Springboot整合Hibernate拦截器EmptyInterceptor
Springboot整合Hibernate拦截器EmptyInterceptor
|
安全 Java 应用服务中间件
Java 近期新闻:Hibernate 6.0、JobRunr 5.0、JHipster 7.8.0、Spring CVEs、JReleaser 1.0-RC2
本期 Java 近期新闻综述内容涉及 JDK 19、Spring Boot、Spring CVEs、Apache Tomcat 点版本、Quarkus Tools for Visual Studio Code、Micronaut 3.4.1、JetBrains 加入 Micronaut 基金会、Open Liberty Paketo Liberty Buildpack、Hibernate 6.0、JobRunr 5.0、WildFly 26.1 Beta S2I 镜像、JReleaser 1.0-RC2、MicroStream 7.0-M2、JHipster 7.8.0、JMH 1.35。
778 0
|
4月前
|
存储 Java 数据库连接
Spring Boot 嵌入式服务器、Hibernate 关系和 Spring Data 全解析
Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中。这使得开发、测试和部署 Web 应用程序变得容易,而且它还是轻量级的、易于启动和停止的,易于配置。
64 0
|
4月前
|
XML Java 数据库连接
Hibernate与Spring整合实践实例
Hibernate与Spring整合实践实例
32 0
|
7月前
|
存储 Oracle Java
[亲测可用]hibernate调用Oracle存储过程|Spring Data JPA调用Oracle存储过程方法
[亲测可用]hibernate调用Oracle存储过程|Spring Data JPA调用Oracle存储过程方法
|
9月前
|
Java 数据库连接 数据库
JAVA三大框架Struts、hibernate和spring的各自作用是什么?
JAVA三大框架Struts、hibernate和spring的各自作用是什么?
48 0
|
XML Java 关系型数据库
Spring 项目快速整合 Hibernate
前言 Hibernate 作为前些年广为流行的 ORM 框架,Spring 在诞生之初也进行了支持,并且抽象出一个 spring-orm 模块。
420 0
|
JavaScript Java 数据库连接
spring对hibernate的集成中的回调(CallBack)机制
spring对hibernate的集成中的回调(CallBack)机制
165 0
spring对hibernate的集成中的回调(CallBack)机制
|
Java 数据库连接 API
Spring整合Hibernate JPA
Spring整合Hibernate JPA
79 0
|
SQL Java 数据库连接
Java Web Spring核心之AOP的解析及实战(AOP的实现、切入点、Aspect Spring的持久化 Hibernate)
Java Web Spring核心之AOP的解析及实战(AOP的实现、切入点、Aspect Spring的持久化 Hibernate)
170 0
Java Web Spring核心之AOP的解析及实战(AOP的实现、切入点、Aspect Spring的持久化 Hibernate)