Hibernate 拦截器的使用--动态表名-阿里云开发者社区

开发者社区> cross__> 正文

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())即可。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一口一口吃掉Hibernate(一)——使用SchemaExport生成数据表
      Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
936 0
如何使用DataWorks的整库迁移给目标表名加上前缀
我们在搭建数仓的时候,有多个业务库需要将数据上云,如果手动来配置这些数据采集的任务,那将会是一个非常繁重的工作。DataWorks中的数据集成提供了整库迁移的功能,来方便大家快速进行数据上云,并可在配置任务的过程中,对目标表添加表前缀,助力于数仓的快速搭建。
4115 0
Hibernate-Validation的使用
首先是要加入下面两个包 hibernate-validator-4.1.0.Final.jar validation-api-1.0.0.GA.jar   如果在验证不通过的时候进行了添加、更新或删除操作的时候,则会抛出javax.
486 0
Hibernate 动态表名映射(数据库分表) NamingStrategy
NamingStrategy接口很有意思,可以作为业务类规范和数据库表规范的桥梁,例如一个数据对象User,对应数据库表是 T_USER,如果所有映射关系都是这样的情况,可以使用NamingStrategy做为一个桥梁衔接,当然你也可以在hbx.xml配置文件中指定 class对应的table.   hibernate.cfg.xml代码就省略了...   User.hbx.xml代码 &
4025 0
【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC
主键生成策略使用UUID报出如警告如下: 控制台- 2017-11-24 18:40:14 [restartedMain] WARN org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.
1541 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4479 0
中文命名之Hibernate 5演示 - 使用注解(annotation)而非xml定义映射
用一个简单例子演示Hibernate 5 + MySQL基本功能中使用中文命名标识符.
678 0
JavaEE Hibernate使用
eclipse上安装插件Hibernate Tools, Help->Intall new Software->Add. 图1.png 其中 Name: HibernateTools Location: http://download.jboss.org/jbosstools/updates/stable/indigo/ 图2.png 选择JBoss Web and Java EE Development中的Hibernate Tools,点击Next,并安装。
763 0
+关注
cross__
研究java方面的相关技术,主要但不限于spring、Hibernate、spring cloud
4
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载