hibernate自定义主键生成器详解

生成主键的类

View Code
复制代码
 1 package action;
 2 
 3 import java.io.Serializable;
 4 import java.util.List;
 5 import java.util.Properties;
 6 
 7 import org.hibernate.HibernateException;
 8 import org.hibernate.MappingException;
 9 import org.hibernate.dialect.Dialect;
10 import org.hibernate.engine.QueryParameters;
11 import org.hibernate.engine.SessionImplementor;
12 import org.hibernate.id.Configurable;
13 import org.hibernate.id.IdentifierGenerator;
14 import org.hibernate.type.Type;
15 /**
16  * 
17 * 类名称:      GeneratePK   
18 * 类描述:     在hibernate的基础上自动生成自定义的主键
19 * 创建人:     andy_lj  
20 * 创建时间:2012-08-10 上午11:40:50     
21 * 修改备注:   
22 * @version
23  */
24 public class GeneratePK implements Configurable, IdentifierGenerator {
25     public String sign;// user000000001中的user
26     public String classname; //实体类的类名
27     public String pk;//主键名字
28     public String idLength;//user000000001的长度
29     
30     /**
31      * 取得User.hbm.xml中的自定义的值
32      */
33     @Override
34     public void configure(Type arg0, Properties arg1, Dialect arg2)
35             throws MappingException {
36         this.classname = arg1.getProperty("classname");
37         this.pk = arg1.getProperty("pk");
38         this.sign = arg1.getProperty("sign");
39         this.idLength = arg1.getProperty("idLength");
40     }
41     /**
42      * 生成主键
43      */
44     @Override
45     public Serializable generate(SessionImplementor arg0, Object arg1)
46             throws HibernateException {
47          //获得主键的长度
48         int leng = Integer.valueOf(idLength);
49         //需要查询数据库中最大的ID号
50         StringBuffer sql = new StringBuffer("select max(a.").append(pk)
51                                                             .append(") from ")
52                                                             .append(classname)
53                                                             .append(" as a where a.")
54                                                             .append(pk)
55                                                             .append(" like '")
56                                                             .append(sign)
57                                                             .append("%'");
58         QueryParameters qp = new QueryParameters();
59         List ls = arg0.list(sql.toString(), qp);
60         String max = (String) ls.get(0);
61         int i = 0;
62         //如果是第一次添加记录那么就是类似user000000001
63         if (max == null || max.trim().equals("")) {
64             max = "1";
65             for(; i < leng-sign.length()-1; i++) {
66                 max = "0" + max;
67             }
68             i = 0;
69             return sign + max;
70         }//不是第一次的操作,并且记录的长度没有超过从配置文件中读取的长度
71         else if(max != null && max.length() <= leng) {
72             max = max.replaceAll(sign, "");
73             Integer imax = Integer.parseInt(max) + 1;
74             String returnnum = String.valueOf(imax);
75             int zero = leng-sign.length()-returnnum.length();
76             for(; i < zero; i++) {
77                 returnnum = "0" + returnnum;
78             }
79             i = 0;
80             return sign + returnnum;
81         }//不是第一次的操作,记录的长度超过了从配置文件中读取的长度
82         else {
83             leng = max.length();
84             max = max.replaceAll(sign, "");
85             Integer imax = Integer.parseInt(max) + 1;
86             String returnnum = String.valueOf(imax);
87             int zero = leng-sign.length()-returnnum.length();
88             for(; i < zero; i++) {
89                 returnnum = "0" + returnnum;
90             }
91             return sign + returnnum;
92         }
93     }
94 
95 }
复制代码

 

配置文件:User.hbm.xml

View Code
复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="entity">
 6     <class name="User" table="TEMP" lazy="false">
 7         <id name="userId" column="userId">
 8             <generator class="action.GeneratePK" >
 9               <param name="classname">User</param>
10               <param name="pk">userId</param>
11               <param name="sign">poli</param>
12               <param name="idLength">13</param>
13             </generator>
14         </id>
15         <property name="name" column="name" />
16         <property name="age" column="age" type="integer"/>
17         <property name="address" column="address" />
18     </class>
19 </hibernate-mapping>
复制代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值