Hibernate获取序列

来源:互联网 发布:用php做99乘法表 编辑:程序博客网 时间:2024/05/16 22:51
现在有这样一个需求,每个员工都有个ID,还有一个工号,ID是Oracle的序列,每次自动加1,而工号是个字符串,总共长8位,前面都是0,后面是员工ID,比如员工ID为88,则其工号为00000088,
首先,员工的工号总是8位,前面都是0,为了解决这个问题,需要在其工号的set方法中添加逻辑,如果工号长度不够8为,前面加0,这个比较好解决:
public void setJobNumber(String jobNumber) {/* * 由于需要获取长度,需要判断入参是否为空,防止空指针异常 */if(StringUtil.isNotEmpty(jobNumber)&&jobNumber.length()<Constant.JOB_NUMBER_LENGTH){while(jobNumber.length()<Constant.JOB_NUMBER_LENGTH){jobNumber="0"+jobNumber;}}this.jobNumber = jobNumber;}

下面就是解决工号获取序列的问题,先给出我的解决方案
Session session = getSession();// session.merge(arg0)Transaction tr = session.beginTransaction();try {session.save(user);//员工工号绝对值取数据库中序列值user.setJobNumber(user.getUserID().toString());tr.commit();} catch (HibernateException e) {tr.rollback();log.debug("regist failed,the reason is :" + e.getMessage());return false;} finally {session.close();}

之所以在session.save(user)再调用user.setJobNumber方法,是因为在save之后,user已经是persistent,此时的user已经和数据库中的一条记录管理,或者说,现在Hibernate已经将数据库中的序列值set到了UserID中了,此时再执行user.setJobNumber(user.getUserID().toString());完全可以获取到用户ID,再次之后,Hibernate也会将该变化映射到数据库中user对应的记录中,在提交之后,即将user变为detached之后,Hibernate会将JobNumber的变化映射到数据库上,即做更新操作,从Hibernate打印的SQL也可以看出实际执行过程:
Hibernate: select USER_ID.nextval from dual
Hibernate: insert into t_user (address, age, college, department, education, email, headPic, height, identity, jobNumber, married, name, nickName, password, phoneNo, role, sex, status, title, userext, weight, userID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: update t_user set jobNumber=? where userID=?

以上是本人的解决方法,不知道是否合理和妥当,或者有没有其他更好的解决方案呢??