你这种设计有问题啊。每注册一个会员创建一个表,重新加载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来实现。