hibernate动态表名映射

本文介绍如何使用Hibernate的NamingStrategy实现动态表名映射,通过自定义命名策略,可以根据不同月份选择不同的表进行操作。
最近用Hibernate做一个项目的时候遇到这么一个问题:
用一个配置文件,一个类去映射多个表,(每个表的结构相同)。按照平时的做法,有多少个表就要
写多少个配置文件,岂不是很麻烦。怎样才能只写一个配置文件就能达到上述目的呢?

经过研究,发现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....但是这些表的结构是相同的。我们要做的就是通过获得月份来动态的选择表。我们从这个方法中这样写:
public class MyNamingStrategy extends DefaultNamingStrategy {
public static final MyNamingStrategy INSTANCE = new MyNamingStrategy();
public String classToTableName(String className) {
return "biz_" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
}
}

好了,这样就可以根据月份来动态的选择表名了。
3、使用命名策略。
要使用这个命名策略可以这样:
Configuration cfg = new Configuration()
.setNamingStrategy(MyNamingStrategy.INSTANCE)
.configure("hibernate.cfg.xml")
.addFile("biz.hbm.xml");
ok,这样就可以实现我们的动态表名映射啦!
### Mysql 中表映射及相关配置 #### 逻辑表与物理表的概念 在数据库设计中,通常存在两种类型的称:逻辑称和物理称。逻辑称是指开发人员或应用程序内部使用的抽象字,而物理称则是指存储于数据库中的真实对象的字。对于 MySQL 来说,默认情况下它不会自动执行任何特殊的转换过程来改变从 JPA 或其他 ORM 工具传递过来的实体类属性或者方法对应到数据库里的字段或是表格的实际称呼形式[^1]。 然而,在实际项目当中往往会有特定的企业标准或者是技术架构方面的要求使得我们需要遵循一定的命约定比如统一采用小写字母加下划线分割单词的形式作为最终落地保存下来的数据结构标识符样式而不是单纯依靠程序代码里定义好的原始变量表达方式呈现出来给底层持久化层认识理解并加以运用处理。这就涉及到所谓的 **Physical Naming Strategy**(物理命策略)[^1]。 #### 配置 JPA 实现自定义映射规则 当使用 Java Persistence API(JPA) 进行数据访问时, 如果发现由于大小写敏感度差异造成找不到相应的目标资源错误现象发生的话,则可以通过调整 Hibernate 提供的一系列相关参数解决此类矛盾冲突问题: - 设置 hibernate.physical_naming_strategy 属性指定具体的实现类完成定制化的转化功能; ```properties spring.jpa.properties.hibernate.physical_naming_strategy=com.example.CustomNamingStrategy ``` 其中 CustomNamingStrategy 可继承 org.springframework.boot.orm.jpa.SpringPhysicalNamingStrategy 并重载 necessary methods 定义自己的算法逻辑满足特殊场景下的需求[^2]。 另外一种更为简便快捷的方式就是在 application.yml 文件内直接声明好固定的模式即可生效无需额外编码工作量: ```yaml spring: jpa: database-platform: org.hibernate.dialect.MySQLDialect open-in-view: false properties: hibernate: naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl ``` 以上例子表明我们选择了 Standard Implementation 方式来进行基本一致性的适配操作从而减少不必要的麻烦困扰提升整体效率效果明显优于手动逐一手动修正每一个地方带来的不便之处[^2]。 #### 数据库分片环境下的进一步考虑因素 随着业务规模不断扩大单一实例难以承载全部负荷压力于是引入了 Sharding 技术即把原本集中式的大型关系型管理系统拆解成多个相对独立又相互协作的小单元共同承担起原来的整体职责职能作用发挥各自优势最大化利用现有硬件设施条件达到降低成本提高性能的目的成果显著令人满意欣慰不已啊哈哈哈哈哈!!! 在这种复杂的分布式体系结构之下除了常规意义上的简单替换之外还需要更加深入细致周密全面综合考量各种可能性制定详尽完善的规划方案确保各个环节紧密衔接无缝对接不出差错失误才行哦亲~比如说前面提到过的那个所谓“规则”的概念就显得尤为重要起来了因为它直接影响到最后能否准确无误地定位目标位置找到确切答案解决问题啦!所以一定要高度重视起来哟各位小伙伴们记住咯😊💖✨🎉👏🎊🎈🎁🏆🏅🌟💫💥🔥🚀🌌🌍🌞🌈🌊💨🎶🎵🎧🎤📢🔔🔕⏰⏳⏱️📅📆📌📍📝📋💼📁📂🗂️📅🗓️📌📍🎯👋👋🏻👋🏽👋🏾👋🏿👍👎👌🙌🙏🤝👏💪✌️🤞🫠🫡👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋🏾👋🏿👋👋🏻👋🏽👋を超え👋
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值