引自:http://blog.csdn.net/xvshu/article/details/39187779

最近的一个项目有一个需求,有N个考核单位,要对每个考核单位生成一张考核情况表,这样做的目的是横切数据库,这这个需求的实现中,我的组员遇到了一个技术问题,我将我的解决办法和整个思考过程与大家分享,

思路:

用一个配置文件,一个类去映射多个表,(每个表的结构相同)。按照平时的做法,有多少个表就要 写多少个配置文件,岂不是很麻烦。怎样才能只写一个配置文件就能达到上述目的呢? 经过研究,发现hibernate中的NamingStrategy可以达到这个目的。它是用来定义表名和列名映射规 则的一个接口。我们要通过实现这个接口来实现自己的命名策略。这个接口中包含的十个方法,其中的 public String classToTableName(String className)是通过类名来映射表名的。实现我们的想法就要用 到这个方法。好了,下面来看怎么做:

步骤:

1、自定义一个类MyNamingStrategy来实现NamingStrategy。(这样你要实现10个方法,如果其他方法 不需要,我们可以通过继承它的一个适配器类DefaultNamingStrategy来只实现我们需要的方法)好了,我 们就继承DefaultNamingStrategy 吧。

2、实现public String classToTableName(String className)方法来实现自己命名策略。

我这的业务需要是每隔一个月就要换一个表。比如1月用biz_1,那么2月就用biz_2….但是这些表的结构是相同的。我们要做的就是通过获得月份来动态的选择表。我们从这个方法中这样写:

/**

*这个类是重新定义一个hibernate的命名规范

**/

public class MyNamingStrategy extends DefaultNamingStrategy {

  1. //这是为了实现单例
  2. public static final MyNamingStrategy INSTANCE = new MyNamingStrategy();
  3. //重新定义名称映射关系
  4. public String classToTableName(String className) {
  5. //自己的名称定义规则
  6. return “biz_” + Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
  7. }
  8. }

好了,这样就可以根据月份来动态的选择表名了。

3、使用命名策略。

要使用这个命名策略可以这样:

Configuration cfg = new Configuration()

.setNamingStrategy(MyNamingStrategy.INSTANCE)

.configure(“hibernate.cfg.xml”)

.addFile(“biz.hbm.xml”);

ok,这样就可以实现我们的动态表名映射啦!

总结:

很多时候,我是经常被自己的思维所束缚,这是我的一种思维惯性,而且我只要找到一种解决问题的方法,就会当作宝典收藏,别人有比你好的,也会有种排斥的信息,二者恰恰是阻碍我们进步的牢笼,我们应该冲破这曾牢笼,我们应该更大胆些,想到且看到我们和以前截然不同的一面!

hibernate动态表名映射的更多相关文章

  1. hibernate动态表名映射--仅仅有想不到,没有做不到

    近期的一个项目有一个需求,有N个考核单位,要对每一个考核单位生成一张考核情况表.这样做的目的是横切数据库,这这个需求的实现中,我的组员遇到了一个技术问题,我将我的解决的方法和整个思考过程与大家分享, ...

  2. 数据分表Mybatis Plus动态表名最优方案的探索

    一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybat ...

  3. 关于mysql存储过程创建动态表名及參数处理

      转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  近期游戏開始第二次内測,開始处理操作日志.最開始把日志放到同一个表里面,发现一天时间,平均100玩家 ...

  4. 使用dao时,如何同时使用动态表名和过滤字段?

    使用dao时,如何同时使用动态表名和过滤字段?  发布于 630天前  作者 wukonggg  316 次浏览  复制  上一个帖子  下一个帖子  标签: 无 如题.求样例代码 1 回复 wend ...

  5. SpringBoot与MybatisPlus3.X整合之动态表名 SQL 解析器(七)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  6. mysql 存储过程 动态表名

    今天写存储过程时,遇到要将表名最为参数的问题,如果不涉及到游标的话,使用prepare可以解决问题,但是,动态表名要运用在游标中的话,则prepare就得靠边站了. 集众人之智慧,最后,使用临时表解决 ...

  7. sqlserver 动态表名 动态字段名 执行 动态sql

    动态语句基本语法: 1 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_execut ...

  8. Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)

    Set类型的使用: <hibernate-mapping package="cn.model"> <class name="Department&quo ...

  9. Hibernate 多表关联映射- 一对多关系映射(one-to-many)

    Hibernage.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

随机推荐

  1. Python程序的打包-上传到pypi

    pypi注册与配置 在pypi的官网:https://pypi.python.org/pypi 注册自己的账号激活账号之后,我们还需要将在本地配置一份文件 在用户的根目录创建文件 : .pypirc在 ...

  2. java操作数据库的基本方法

    此次开发工具为eclipse,才有的数据库驱动是mysql-connector-java-5.1.8-bin.jar 第一步,在eclipse的工程目录中引用mysql驱动 驱动下载地址:https: ...

  3. [原创]K8 CMS GoastGuard 密码解密工具

    工具: K8 CMS GoastGuard PASS Decrypt编译: VS2012  C# (.NET Framework v4.5)组织: K8搞基大队[K8team]作者: K8拉登哥哥博客 ...

  4. vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件

    vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...

  5. vue教程2-01 vue生命周期、钩子函数

    vue教程2-01 vue生命周期.钩子函数 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. android初探

    随着nodejs的不断发展,前端的范围越来越大,所以,适当的了解移动端是非常有必要的,比如使用RN开发app,前端必须要和安卓工程师沟通共同开发,那么学习android的基本知识就很重要了,因为目前安 ...

  7. TensorFlow.js之根据数据拟合曲线

    这篇文章中,我们将使用TensorFlow.js来根据数据拟合曲线.即使用多项式产生数据然后再改变其中某些数据(点),然后我们会训练模型来找到用于产生这些数据的多项式的系数.简单的说,就是给一些在二维 ...

  8. C#基础篇五值类型和引用类型

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...

  9. jenkins持续集成的步骤

    项目的持续集成分享 源代码管理 项目仓库 配置仓库 发布仓库 ci/cd相关 gitlab,管理版本,测试流水线 jenkins,对项目进行持续集成 各模块的关系 graph TD a(jenkins ...

  10. docker 使用时一些问题点

    1.run 参数 --privileged,默认是关闭的,使用该参数,container 内的 root 拥有真正的 root 权限,否则,container 内的 root 只是外部的一个普通用户权 ...