<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 自定義主鍵生成器

    /**
     * 
     
    */
    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);

        
    //存儲(chǔ)最大值的數(shù)組的容量
        private static final int MAX_CAPACITY = 2000;

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

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

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

        
    //最大值數(shù)組已經(jīng)使用的容量
        private static int lastIndex;

        
    //遞增步長(zhǎng),默認(rèn)加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);
           
            
    //得到流水號(hào),是自己寫的工具類生成的.形式為000x
            String seqStr = String.valueOf(t_SeqNo);
            
    //JspFormate.currentFormateORM(seq);
            
    //得到y(tǒng)ymmdd,是自己寫的方法工具類生成的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;
        }

        
    /**
         * 找到表中自動(dòng)增長(zhǎng)字段存儲(chǔ)在數(shù)組中的索引值
         * 
    @return 索引值
         
    */
        
    private int findIndex() {
            
    int index = 0;

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

            
    //如果沒有找到就從數(shù)據(jù)庫(kù)中讀出最大值并進(jìn)行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參數(shù)
            String table = params.getProperty("table");

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

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

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

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

            returnClass 
    = type.getReturnedClass();

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

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

            
    //構(gòu)造存儲(chǔ)在Map中的索引值的key name
            key = table + "_$_" + column;

            
    //根據(jù)參數(shù)構(gòu)造取最大值的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>



    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线免费观看h片| 亚洲视频免费观看| 特级毛片全部免费播放a一级 | 免费精品国偷自产在线在线| 日本人成在线视频免费播放| 中文字幕无码一区二区免费| 国产啪精品视频网站免费尤物| 久久99免费视频| 99re6热视频精品免费观看 | 亚洲综合欧美色五月俺也去| 精品亚洲AV无码一区二区三区 | AV在线播放日韩亚洲欧| 国产成人精品日本亚洲专区 | 亚洲黄片手机免费观看| a级毛片视频免费观看| a在线视频免费观看| 一级毛片成人免费看免费不卡| 最近中文字幕无免费| 久久精品国产免费观看三人同眠| 免费人成在线观看69式小视频| 久久久久久久免费视频| 日韩在线看片免费人成视频播放| 免费人妻无码不卡中文字幕18禁| 亚洲日韩涩涩成人午夜私人影院| 中文字幕亚洲乱码熟女一区二区| 亚洲Aⅴ无码专区在线观看q| 亚洲国产精品乱码在线观看97| 亚洲日产乱码一二三区别| 免费看一级一级人妻片| 少妇性饥渴无码A区免费| 69国产精品视频免费| 成人av免费电影| 亚洲国产精品尤物YW在线观看| 五月婷婷在线免费观看| 免费鲁丝片一级观看| 男女超爽刺激视频免费播放| 免费国产真实迷j在线观看| 国产午夜亚洲精品午夜鲁丝片| 亚洲高清资源在线观看| 亚洲成av人影院| 亚洲中文字幕无码永久在线|