<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 閱讀(2144) 評論(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>



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


    網站導航:
     
    主站蜘蛛池模板: 国精产品一区一区三区免费视频| 亚洲精品免费在线视频| 国产成人人综合亚洲欧美丁香花| 免免费国产AAAAA片| 亚洲人成伊人成综合网久久| 99久久国产热无码精品免费| 亚洲国产成人久久| 99精品国产免费久久久久久下载| 亚洲va在线va天堂成人| 毛片高清视频在线看免费观看| 亚洲w码欧洲s码免费| 久久精品女人天堂AV免费观看| 亚洲 欧洲 日韩 综合在线| 黄色成人网站免费无码av| 亚洲国产精品99久久久久久| 国产高清免费观看| 黄色免费网址在线观看| 亚洲美日韩Av中文字幕无码久久久妻妇 | 无码日韩精品一区二区免费| 在线综合亚洲中文精品| 日韩精品免费一区二区三区| 老司机午夜在线视频免费观| 色久悠悠婷婷综合在线亚洲| 午夜精品射精入后重之免费观看 | 国产亚洲欧洲精品| 鲁大师在线影院免费观看| 亚洲一区二区免费视频| 日韩人妻无码免费视频一区二区三区| 风间由美在线亚洲一区| 国产亚洲精aa成人网站| 18pao国产成视频永久免费| 亚洲国产av玩弄放荡人妇| 国产精品亚洲综合专区片高清久久久| 精品四虎免费观看国产高清午夜| 亚洲人成网站日本片| 免费国产高清视频| 免费无码又爽又刺激高潮视频| 亚洲男人天堂2022| 国产成人综合亚洲亚洲国产第一页 | 91在线免费视频| 亚洲国产成人99精品激情在线|