hibernate自定义主键生成器详解
来源:互联网 发布:淘宝一元秒杀 编辑:程序博客网 时间:2024/05/01 17:14
生成主键的类
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 * @version23 */24 public class GeneratePK implements Configurable, IdentifierGenerator {25 public String sign;// user000000001中的user26 public String classname; //实体类的类名27 public String pk;//主键名字28 public String idLength;//user000000001的长度29 30 /**31 * 取得User.hbm.xml中的自定义的值32 */33 @Override34 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 @Override45 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 //如果是第一次添加记录那么就是类似user00000000163 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>
0 0
- hibernate自定义主键生成器详解
- Hibernate自定义主键生成器
- Hibernate主键生成器详解
- hibernate中自定义主键生成器
- hibernate中自定义主键生成器
- hibernate 主键生成器解释
- Hibernate主键生成器
- Hibernate主键生成器说明
- Hibernate主键生成器generator
- hibernate主键策略生成器
- Hibernate主键策略生成器
- Hibernate主键生成器
- hibernate主键生成器
- HIbernate如何设置主键生成器
- hibernate自定义主键
- Hibernate自定义主键
- hibernate的自定义主键
- Hibernate自定义主键
- 关于Myeclipse8.5在程序运行中查看变量值的问题
- FZU Problem 1002 HangOver【】
- 廖大JS教程的笔记
- 恶搞小程序
- 使用nodepad++创建html模板
- hibernate自定义主键生成器详解
- 分享一个react + redux 完整的项目,同时写一下个人感悟
- CentOS7安装MariaDB成功的实践
- 一道被"坑"到的前端Javascript面试题
- js基础8-应用案例
- HDU2717 Catch That Cow
- centos7.2快速运行web项目
- Jekyll+GitHub搭建个人博客
- Java中继承thread类与实现Runnable接口的区别