生成主键的类

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>
本文介绍了一种基于Hibernate框架的自定义主键生成器实现方法。该生成器可根据配置生成特定格式的主键,适用于需要定制化主键格式的应用场景。

347

被折叠的 条评论
为什么被折叠?



