`

hibernate自定义主键生成器

阅读更多
hibernate可以自定义主键,自定义的主键策略可以指定实现类,保存时自动调用自定义的类来获取主键,前提是自定义的类要实现IdentifierGenerator接口。

另外,看网上许多人的做法,还要实现Configurable接口的configure方法,其实该方法就是获取hbm.xml对应的数据库的相关信息(表名,主键名等),因为IdentifierGenerator接口的generate(SessionImplementor session, Object object)方法有个入参是hbm.xml对应的实体对象object,那么,可以利用此object反射hbm.xml的中数据库信息,也就是通过此object的AbstractEntityPersister类来获取。


编写主键生成器类
package common.dao.hibernate;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.SessionFactory;
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.persister.entity.AbstractEntityPersister;
import org.hibernate.type.Type;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import xxx.xxx.common.KeyGenerator;

/**
 * @ClassName: HibernateUserDefinedIDGenerator
 * @Description: TODO(自定义主键生成器,需要在hbm.xml中或者Annotation中主键的generator的class指定该类)
 * @Company xxx
 * @author fulg
 * @date 2013-10-29
 */
public class HibernateUserDefinedIDGenerator extends HibernateDaoSupport implements IdentifierGenerator{

	//private Integer step = 4;//ID增长的步长
	

	/**
	 * (非 Javadoc)
	 * Title: generate

	 * Description:hibernate自动调用

	 * @param session
	 * @param object
	 * @return
	 * @throws HibernateException
	 * @see org.hibernate.id.IdentifierGenerator#generate(org.hibernate.engine.SessionImplementor, java.lang.Object)
	 * @author fulg
	 * @date 2013-10-29
	 */
	@Override
    public Serializable generate(SessionImplementor session, Object object)throws HibernateException {
		

       //持久化对象
	  AbstractEntityPersister classMetadata =
                     (AbstractEntityPersister)session.getFactory()
                                      .getClassMetadata(object.getClass());  
	 
      String tableName = classMetadata.getTableName();//表名
	  String IdentifierPropertyName = classMetadata.getIdentifierPropertyName();//id字段名
		
	//调用之前已有的主键生成工具
	//return KeyGenerator.getInstance(session.getFactory(), tableName, IdentifierPropertyName, step).getNextKey();

		
  //到这里已经拿到了表名、id的字段名、session,可以session.connection()获取链接JDBC方式来拼写SQL操作数据库了

  //既然继承了HibernateDaoSupport ,也拿到了session.getFactory(),那么也可以利用hibernate的getHibernateTemplate()来操作数据库了
               
         /*
        //新手注意,不setSessionFactory,getHibernateTemplate()为null
         setSessionFactory(session.getFactory());            

         getHibernateTemplate().executeFind(//以executeFind为例,能用的方法很多
	     new HibernateCallback() {
		     public Object doInHibernate(Session session)
				throws HibernateException {
			        Query query = session.createQuery(hql);
							
					.... .....
							
					return query.list();
		     }
	   });	
           */
	}

}



在xxx.hbm.xml中配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="xxx.xxx.model.JianDingShenQing" table="X_XXShenQing" >
        <id name="hangBiaoShi" type="java.lang.Integer">
            <column name="HangBiaoShi" />
            <generator class="common.dao.hibernate.HibernateUserDefinedIDGenerator" />
        </id>
        <property name="renWuMingCheng" type="java.lang.String">
            <column name="RenWuMingCheng" length="200" />
        </property>
        <property name="renWuDanHao" type="java.lang.String">
            <column name="RenWuDanHao" length="50" not-null="true" />
        </property>
         
        ... ...

        <property name="beiYongZi" type="java.lang.Integer">
            <column name="BeiYongZi" />
        </property>
        <property name="beiYongZiFu" type="java.lang.String">
            <column name="BeiYongZiFu" />
        </property>
    </class>
</hibernate-mapping>


至于在程序中的使用,平时怎么用hibernate操作的还怎么操作,只是id不用再手动的维护了。
0
0
分享到:
评论

相关推荐

    JPA学习笔记-EJB-03JPA主键生成策略总结

    总结一下关于JPA的主键生成策略,JPA是用@GeneratedValue标记来注释的。...2. TABLE:自定义表生成器 3. Identity:像MS SQL支持Identity字段的生成主键策略 4. Sequence:像Oracle支持Sequence的生成主键策略

    好用的代码生成源码

    rapid-framework是一个以spring为核心的项目脚手架(或者称为胶水框架),框架将各个零散的框架(struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生成器,辅助项目开发,可以生成...

    Hibernate 中文 html 帮助文档

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一...

    最全Hibernate 参考文档

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (optional) 5.1.9. property 5.1.10. 多对一...

    Hibernate教程

    触发器实现的主键生成器(Primary keys assigned by triggers) 6.1.5. composite-id 6.1.6. 鉴别器(discriminator) 6.1.7. 版本(version)(可选) 6.1.8. timestamp (optional) 6.1.9. property 6.1.10. 多...

    hibernate 体系结构与配置 参考文档(html)

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对...

    AutoCode代码生成器(JAVA版)

    您是不是因为java的开发和维护...☆ 支持自定义查询接口的生成,用户可以定义查询条件。 ☆ 生成的jsp文件及servlet完全处理好了精度字段的精度及显示处理。 ☆ 目前支持Oracle、Sqlserver 数据库对象的自动生成代码。

    java代码生成器源码-wdo-code:wdo-code是Java语言实现的快速开发工具;包含基于POI实现的导入导出excel文件扩展工具

    UUID主键生成扩展工具。 poi-document-extend主要功能 自定义模板导出excel文件。 支持xml配置导入导出excel映射关系。 扩展导入数据回调函数支持批量查询等 版权声明 iBase4J使用 协议. 加入QQ群[216310267] 交流...

    Hibernate3的帮助文档

    触发器实现的主键生成器(Primary keys assigned by triggers) 6.1.5. composite-id 6.1.6. 鉴别器(discriminator) 6.1.7. 版本(version)(可选) 6.1.8. timestamp (optional) 6.1.9. property 6.1.10. 多...

    JAVA代码生成工具

    数据库表配置,用于自定义生成器模板引用的table变量,配置文件必须存放在classpath: generator_config/table/table_name.xml (该文件生成器可以生成,自己再自定义修改) &lt;!-- &lt;数据库表名 className="类名称" ...

    hibernate3.04中文文档.chm

    触发器实现的主键生成器(Primary keys assigned by triggers) 6.1.5. composite-id 6.1.6. 鉴别器(discriminator) 6.1.7. 版本(version)(可选) 6.1.8. timestamp (optional) 6.1.9. property 6.1.10. ...

    Hibernate3+中文参考文档

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (optional) 5.1.9. property 5.1.10. 多对一...

    hibernate 框架详解

    触发器实现的主键生成器(Primary keys assigned by triggers) 6.1.5. composite-id 6.1.6. 鉴别器(discriminator) 6.1.7. 版本(version)(可选) 6.1.8. timestamp (optional) 6.1.9. property 6.1.10. ...

    Hibernate参考文档

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一...

    ssh(structs,spring,hibernate)框架中的上传下载

     fileContent字段映射为Spring所提供的BlobByteArrayType类型,BlobByteArrayType是用户自定义的数据类型,它实现了Hibernate 的org.hibernate.usertype.UserType接口。BlobByteArrayType使用从sessionFactory获取...

    从J2SE到J2EE知识点介绍

    (八) 复合自然主键实例(源代码hibernate_0500) 218 (九) Hibernate的类型 224 1. Java基本值类型的Hibernate映射 224 2. Java时间和日期类型的Hibernate映射类型 224 3. Java大对象类型的Hibernate映射类型 225 4....

    Grails 中文参考手册

    2.11 生成Grails应用 3. 配置 3.1 基本配置 3.1.1 内置选项 3.1.2 日志 3.2 环境 3.3 数据源 3.3.1 数据源和环境 3.3.2 JNDI数据源 3.3.3 自动数据库移植 3.4 外部配置 3.5 定义版本 4. 命令行 4.1 创建Gant脚本 4.2...

    autocode中文java版

    AutoCode代码生成器宗旨:简洁、实用、高效、协作  您是不是因为java的开发和维护繁琐而烦恼,目前政府机关、企业大都要求用java来开发项目,本软件将彻底解决您的后顾之忧,通过本软件的自动生成功能,生成的java...

    NHibernate中文帮助手册API

    (主键生成策略)generator  5.1.4.2. 高/低位算法(Hi/Lo Algorithm)  5.1.4.3. 唯一标识16进制算法(UUID Algorithm )  5.1.4.4. 唯一标识字符串算法  5.1.4.5. 唯一标识GUID算法  5.1.4.6. 标识字段...

Global site tag (gtag.js) - Google Analytics