軟體印象

          Kavin
          posts - 13, comments - 0, trackbacks - 0, articles - 0

          Hibernate ID generator 自定義主鍵生成器

          Posted on 2011-05-06 13:42 Kavin 閱讀(2141) 評論(0)  編輯  收藏
          Hibernate ID generator 自定義主鍵生成器

          /**
           * 
           
          */
          package com.ge.hc.eapp.generator;


          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;

          import org.hibernate.HibernateException;
          import org.hibernate.MappingException;

          import org.hibernate.dialect.Dialect;

          import org.hibernate.engine.SessionImplementor;

          import org.hibernate.id.Configurable;
          import org.hibernate.id.IdentifierGenerator;
          import org.hibernate.id.PersistentIdentifierGenerator;

          import org.hibernate.type.Type;

          import java.io.Serializable;

          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.ResultSet;
          import java.sql.SQLException;

          import java.util.Date;
          import java.util.HashMap;
          import java.util.Map;
          import java.util.Properties;
          import java.util.Properties;

          /**
           * 
          @author Kavin
           *
           
          */
          public class DispNoGenerator implements IdentifierGenerator, Configurable {
              
          private static final Log log = LogFactory.getLog(DispNoGenerator.class);

              
          //存儲最大值的數組的容量
              private static final int MAX_CAPACITY = 2000;

              
          /* 同步鎖 */
              
          private static final Object lock = new Object();

              
          //存儲表存儲在數組中的索引值
              private static Map map = new HashMap();

              
          //最大值數組
              private static long[] seqs = new long[MAX_CAPACITY];

              
          //最大值數組已經使用的容量
              private static int lastIndex;

              
          //遞增步長,默認加1
              private int step = 1;
              
          private String key;
              
          private String sql;
              
          private Connection connection;
              
          private Class returnClass;

              
          public Serializable generate(SessionImplementor session, Object object)
                  
          throws HibernateException {
                  
          // TODO Auto-generated method stub
                  connection = session.connection();

          //        long seq = -1;

                  
          //找到索引值
          //        int index = findIndex();

          //        //把最大值加1
          //        seqs[index] = seqs[index] + step;
          //
          //        seq = seqs[index];
                  
                  String strGenerateId 
          = null;
                  System.out.println(
          "this.sql="+this.sql);
                  
          try {
                      
          long t_SeqNo = this.getSeqValue();
                  
                  System.out.println(
          "t_SeqNo="+t_SeqNo);
                 
                  
          //得到流水號,是自己寫的工具類生成的.形式為000x
                  String seqStr = String.valueOf(t_SeqNo);
                  
          //JspFormate.currentFormateORM(seq);
                  
          //得到yymmdd,是自己寫的方法工具類生成的yymmdd
                  String preDate = "20110506";
                  
          //得到hhmmss,是自己寫的工具類獲取的hhmmss
                  
          //String preHour = JspFormate.dateFormateOnlyHHMMSSORM(new Date());
                  String preHour = "1035";
                  strGenerateId 
          = preDate + preHour + seqStr;
                  } 
          catch (SQLException e) {
                      log.error(e);
                      e.printStackTrace();
                  }

                  
          return strGenerateId;
              }

              
          /**
               * 找到表中自動增長字段存儲在數組中的索引值
               * 
          @return 索引值
               
          */
              
          private int findIndex() {
                  
          int index = 0;

                  
          //首先中緩存中取出索引值
                  Integer integer = (Integer) map.get(key);

                  
          //如果沒有找到就從數據庫中讀出最大值并進行cache
                  if (null == integer) {
                      
          //double check lock
                      synchronized (lock) {
                          integer 
          = (Integer) map.get(key);

                          
          if (null == integer) {
                              
          long maxvalue = 1;

                              
          try {
                                  maxvalue 
          = this.getSeqValue();
                              } 
          catch (SQLException e) {
                                  log.error(e);
                              }
                              maxvalue 
          = new Long(0).longValue();

                              integer 
          = new Integer(lastIndex++);
                              seqs[integer.intValue()] 
          = maxvalue;
                              map.put(key, integer);
                          }
                      }
                  }

                  index 
          = integer.intValue();

                  
          return index;
              }

              
          public void configure(Type type, Properties params, Dialect d)
                  
          throws MappingException {
                  
          //     取出table參數
                  String table = params.getProperty("table");

                  
          if (table == null) {
                      table 
          = params.getProperty(PersistentIdentifierGenerator.TABLE);
                  }

                  
          //取出column參數
                  String column = params.getProperty("column");

                  
          if (column == null) {
                      column 
          = params.getProperty(PersistentIdentifierGenerator.PK);
                  }

                  
          //表的sehcma參數
                  String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);

                  returnClass 
          = type.getReturnedClass();

                  
          //取出step參數
                  String stepvalue = params.getProperty("step");

                  
          if ((null != stepvalue) && !"".equals(stepvalue.trim())) {
                      
          try {
                          step 
          = Integer.parseInt(stepvalue);
                      } 
          catch (Exception e) {
                          log.error(e);
                      }
                  }

                  
          //構造存儲在Map中的索引值的key name
                  key = table + "_$_" + column;

                  
          //根據參數構造取最大值的SQL
                  sql = "select SEQ_COMPANY_ID.nextval from dual";

                  
              }

              
          /**
               * 取指定SEQUENCE的值,不存在記錄返回0
               * 
          @return Sequence最大值
               * 
          @throws SQLException if sql error occurs.
               
          */
              
          private long getSeqValue() throws SQLException {
                  
          long maxvalue = 0;

                  PreparedStatement st 
          = connection.prepareStatement(sql);
                  System.out.println(
          "============================================" + sql);
                  ResultSet rs 
          = null;

                  
          try {
                      rs 
          = st.executeQuery();

                      
          if (rs.next()) {
                          maxvalue 
          = rs.getLong(1);
                      }

                      sql 
          = null;
                  } 
          finally {
                      
          if (rs != null) {
                          rs.close();
                      }

                      st.close();
                  }

                  
          return maxvalue;
              }
              
              
          /**
               * 取指定表中id字段的最大值,不存在記錄返回0
               * 
          @return 最大值
               * 
          @throws SQLException if sql error occurs.
               
          */
              
          private long getMaxvalue() throws SQLException {
                  
          long maxvalue = 0;

                  PreparedStatement st 
          = connection.prepareStatement(sql);
                  System.out.println(
          "============================================" + sql);
                  ResultSet rs 
          = null;

                  
          try {
                      rs 
          = st.executeQuery();

                      
          if (rs.next()) {
                          maxvalue 
          = rs.getLong(1);
                      }

                      sql 
          = null;
                  } 
          finally {
                      
          if (rs != null) {
                          rs.close();
                      }

                      st.close();
                  }

                  
          return maxvalue;
              }
          }

          Hibernate 配置文件

          <id name="userId" type="java.lang.String">
                      
          <column name="USER_ID" />
                      
          <generator class="com.xx.generator.DispNoGenerator" />
                  
          </id>



          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 清水河县| 沐川县| 高青县| 衡南县| 华阴市| 平顺县| 沙雅县| 闻喜县| 姜堰市| 丰城市| 建瓯市| 雅江县| 独山县| 富宁县| 水富县| 惠来县| 英德市| 襄樊市| 信丰县| 石林| 三穗县| 恩施市| 阜宁县| 昌平区| 邻水| 横峰县| 仲巴县| 饶河县| 舞阳县| 翼城县| 周口市| 高雄县| 长乐市| 特克斯县| 莱阳市| 河源市| 山丹县| 商南县| 河间市| 平定县| 浑源县|