用户登录
用户注册

分享至

hibernate实现动态拼装

  • 作者: 让我来日_邢一珊
  • 来源: 51数据库
  • 2021-01-29
我的需求是在数据库中相同表结构,不同表名的表有多个,然后在程序运行当中,读写合适的表,在网上查找资料发现了一个叫NamingStrategy的类,说是修改tableName方法,然而当我注入自己的NamingStrategy类运行后,发现只是在spring启动时执行了多次tableName方法,初始化资源,而在运行时就不再调该方法了,并没有实现我想要的效果,我现在很困惑,hibernate能不能实现动态表名,求指点方向问题补充:<div class="quote_title"hzhlu 写道</div<div class="quote_div"能实现,我的blog中有</div /您的那篇博文我拜读过,但是NamingStrategy只能实现项目启动时动态映射合适的表,但在hibernate初始化之后,不会再调那个类的那个方法了,动态表名实现不了问题补充:<div class="quote_title"hzhlu 写道</div<div class="quote_div"?</div /好像spring的LocalSessionFactoryBean在创建时会将xml与pojo的映射关系放到map里面,在生成这种映射关系时会调tableName方法,此后再取表名的时候就不用tableName方法了,至于表名具体怎么取的,我就不懂了,源码看着晕



  你这种设计有问题啊。每注册一个会员创建一个表,重新加载hbm,是不是还要刷新一次sessionfactory?如果有人不停注册,那你的服务还跑不跑了?

你计算贡献值完全可以放在一个表中通过1对多或者hql来过滤。

如果非要分表做,那就远离hbm,通过session.createsqlquery()调用本地sql语句对数据库直接进行操作。

=================

理解错了,抱歉。这个可以结合你的数据库来看了。 我对pgsql比较熟, pgsql支持子表, 可以建立一个父表,然后每个月建立一个子表,查询的时候直接查询父表, pgsql会根据查询条件里的时间范围自动决定是在所有子表中查还是在特定子表中查。select * from 父表是可以检索到所有值的,这个机制在物理上又实现了数据水平切分和可管理性。

所以如果支持父-子表机制的数据库里,可以通过数据库本身的特性来实现,hbm不需要改变,映射到父表即可。insert时候会自动写入子表。如果子表不存在则写入父表。

如果在不支持父-子机制的数据库里,查询通过createsqlquery来做,hibernate支持将未映射的查询结果transform为特定的类型的对象。例如:

query.setresulttransformer(transformers.aliastobean(myobject.class));
query.list();

insert通过时间字段计算出要写入的数据表,通过insert来执行写入。

总之,我给出的意见就是,支持子表特性的数据库hbm来实现,不支持子表特性或者想脱离数据库依赖那就用sql来实现。
软件
前端设计
程序设计
Java相关