现在有一应用系统:
每条记录都有一个唯一的记录号,组成方式为:公司英文缩写+4位年+2位月+6位流水号,如...,XX2008040032457,XX200804032458,...;到了新的一年后,前面的生成方式不变,后6位的流水号归零,重新计数,如:XX200901000001,XX200901000002....,
之前的应用逻辑是:有这个表中,一列保存完整的记录号(主键),别外一列保存生成的当前记录的流水号,
插入一条记录是,先从数据库中找出最大的流水号+1作为当前流水号,然后组合成记录号;
保存后的示例:
     id                    sequence
------------------------------------------------
XX2008040032457             0032457
XX2008040032458             0032458
但是现状存在一问题,就是新一年流水号清零?
我的思路是这样,判断日期,是果是1月1日,就认为是新的一年,然后就把sequence列全部更新为空,这时再找数据库中保存的最的流水号就是零了,但是我担心就是,新年的第一条记录要执行这两个操作的可靠性!因为毕竟一年的记录近百万条记录,全部清空sequence列,,方法挺笨另外一个思路是:
稍微改变下数据结构,记录号(主键不变),另外保存 流水号的列用数据库的自增列,保存是直接取前一条记录的流水号加1,生成记录号(主键)后就保存这条记录,新年时只需要把记数器重置为0就可以了,但因为现在用hibernate,不知道这样的数据结构如果做映射。现在到这儿来请教高人指点!或给个思路,或给这个结构做个映射?万分感激!我现在用的是hibernate+sql server2000,请问这样的逻辑在程序中或数据库中如何实现,hibernate如何对这样的结构做映射?

解决方案 »

  1.   

    简单,你每年做一个序列,比如
    seq_2008
    seq_2009
    seq_2010我想你先做10年的足以然后,我想你知道怎么做了。至于hibernate 我想不适合自动生成,因为配置文件不能动态改,可以用assign进行手工设置主键/编号
    年 + 月+ seq_年.nextval()
    就行了!
      

  2.   

    晕,你是sqlserver
    那你分别建几个主键表了
    t_2008
    t_2009
    t_2010
    同样。每个表只有一个id列,从identity 类型的自增长!呵呵! 其它的一样,你每次insert 一个到表里,就拿到了最新的id