package com.mossle.internal.sequence.component; import java.util.Calendar; import java.util.Date; import javax.annotation.Resource; import com.mossle.internal.sequence.persistence.domain.SequenceInfo; import com.mossle.internal.sequence.persistence.manager.SequenceInfoManager; import com.mossle.internal.sequence.support.SequenceHelper; import org.hibernate.LockMode; import org.hibernate.Query; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component public class DatabaseSequenceHelper implements SequenceHelper { private SequenceInfoManager sequenceInfoManager; @Transactional public String process(String code, Date date) { if (code == null) { throw new IllegalArgumentException("code is null"); } if (date == null) { throw new IllegalArgumentException("date is null"); } code = code.trim().toUpperCase(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date targetDate = calendar.getTime(); String hql = "from SequenceInfo where code=?"; Query query = sequenceInfoManager.createQuery(hql, code); query.setLockMode("SequenceInfo", LockMode.WRITE); SequenceInfo sequenceInfo = (SequenceInfo) query.setFirstResult(0) .setMaxResults(1).uniqueResult(); int sequence = 0; if (sequenceInfo == null) { sequenceInfo = new SequenceInfo(); sequenceInfo.setCode(code); sequenceInfo.setValue(1); sequenceInfo.setUpdateDate(targetDate); } else { Date updateDate = sequenceInfo.getUpdateDate(); if (updateDate == null) { sequenceInfo.setUpdateDate(targetDate); sequenceInfo.setValue(1); } else if (updateDate.before(targetDate)) { sequenceInfo.setUpdateDate(targetDate); sequenceInfo.setValue(1); } else { sequenceInfo.setValue(sequenceInfo.getValue() + 1); } } sequenceInfoManager.save(sequenceInfo); sequence = sequenceInfo.getValue(); if (sequence >= 100000) { throw new IllegalStateException(sequence + " is larger than 100000, cannot process it."); } // sequence += 100000; // String code = Integer.toString(sequence).substring(1); // return code; return Integer.toString(sequence); } @Resource public void setSequenceInfoManager(SequenceInfoManager sequenceInfoManager) { this.sequenceInfoManager = sequenceInfoManager; } }