<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    軟體印象

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

    Hibernate ID generator 自定義主鍵生成器

    Posted on 2011-05-06 13:42 Kavin 閱讀(2134) 評論(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>



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


    網站導航:
     
    主站蜘蛛池模板: 日本免费一区二区三区最新| 中文字幕在线免费观看| 免费国产一级特黄久久| 亚洲欧美熟妇综合久久久久 | 蜜桃视频在线观看免费视频网站WWW| 一本到卡二卡三卡免费高| 国产一级淫片a视频免费观看| 国产亚洲精品无码专区| 一区二区三区免费在线观看| 亚洲熟女少妇一区二区| 国内精品99亚洲免费高清| 亚洲午夜久久影院| 99久久免费精品国产72精品九九 | a级毛片毛片免费观看久潮| 亚洲视频在线一区二区| 韩国免费A级毛片久久| 亚洲综合色视频在线观看| 久久久久久噜噜精品免费直播| 97视频热人人精品免费| 亚洲中文无码永久免费| 免费午夜爽爽爽WWW视频十八禁| 亚洲AV美女一区二区三区| 免费v片在线观看视频网站| 亚洲一卡2卡三卡4卡无卡下载| 全黄大全大色全免费大片| 亚洲精品高清无码视频| 美丽姑娘免费观看在线观看中文版 | 四虎影视永久免费观看| 国产A∨免费精品视频| 亚洲视频免费观看| 永久免费的网站在线观看| 边摸边脱吃奶边高潮视频免费| 18禁超污无遮挡无码免费网站国产 | 久久亚洲AV成人无码电影| 亚洲高清免费在线观看| 国产精品亚洲综合天堂夜夜| 亚洲妇熟XXXX妇色黄| 18禁超污无遮挡无码免费网站国产| 亚洲国产综合在线| 亚洲国产精品碰碰| 国产成人精品免费视频大|