应用场景:同一数据库中,有一些结构完全相同的表,只是表名不一样,比如日志表。
分表可能是数据量的考虑,也可能是数据隔离的考虑,比如多租户应用中。
由于项目使用了Spring Data-JPA(JPA实现是Hibernate),而JPA不仅没有提供动态表名映射,而且大部分JPA实现会pre-compile some queries,所以在JPA技术下做分表非常困难。
因为分表、分库这类需求与sql语句联系紧密,所以对应的办法是选择jdbc、mybatis、jdbcTemplate这类使用原生sql的技术,Hibernate的方法1、方法2比较麻烦。
Hibernate中,一个SessionFactory代表着一个特定数据库的特定配置:
SessionFactory is a global factory responsible for a particular database. If you have several databases, for easier startup you should use several <session-factory> configurations in several configuration files.
创建SessionFactory时,实体-表名的映射关系也就固定了。多次创建不同的SessionFactory,然后建立不同的实体-表名映射。
安全问题:
动态表名意味着字符串拼接,而字符串拼接意味着sql注入。