`

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主键生成策略总结

    2. **TABLE(自定义表生成器)** - **概述**:`TABLE`策略通过在数据库中创建一个单独的表来管理主键值。这种方式相对独立于数据库类型,适合需要跨库生成唯一ID的场景。该策略通过`@TableGenerator`注解来配置...

    Swing编写的Hibernate生成器

    3. **注解**:如`@Entity`表示这是一个Hibernate实体,`@Table`指定对应数据库中的表名,`@Id`标识主键,`@GeneratedValue`处理主键生成策略。 除了实体类,生成器还会自动生成对应的Hibernate映射文件(.hbm.xml)...

    Hibernate主键类型说明和配置手册.doc

    总的来说,选择合适的主键生成策略和正确配置是Hibernate成功集成到项目的关键步骤。理解这些策略的差异以及它们如何与不同数据库交互,将有助于优化性能并避免潜在的问题。在实际开发中,应根据项目需求和所使用的...

    Hibernate 映射文件自动生成

    【标签】:“源码”和“工具”表明这篇内容可能涉及到具体的代码实现和辅助开发的工具,可能是通过某种代码生成器或者IDE插件来实现映射文件的自动化创建。 【压缩包子文件的文件名称列表】:“hibernate映射文件...

    sql主键产生器

    6. **第三方库**:在编程语言层面,有许多库和框架提供了主键生成的功能,如Java的Hibernate或Spring框架,它们可以与数据库交互,自动处理主键生成。 使用"SQL主键产生器"工具的优点在于,它可以帮助开发者避免...

    hibernate自动生成

    自动生成的Entity类通常包含属性(对应表的字段)和getter/setter方法,有时还会包含一些特定的Hibernate注解,如@Id(主键)和@GeneratedValue(主键生成策略)。 2. **映射文件(Mapping Files)**:在传统的...

    hibernate实体生成工具

    - **可定制化**:多数实体生成工具允许用户自定义生成模板,比如字段命名规则、注释等。 - **兼容性**:工具通常支持多种数据库,如MySQL、Oracle、PostgreSQL等。 - **版本控制**:随着数据库表结构的修改,工具也...

    实体类生成器

    1. **数据库元数据获取**:实体类生成器首先需要连接到数据库,通过SQL查询获取表的信息,包括表名、字段名、数据类型、主键等。 2. **模板引擎**:生成器通常使用模板引擎,如FreeMarker或Velocity,来定义实体类...

    hibernate v3.04中文参考手册

    - 自定义主键生成策略,如SequenceGenerator、TableGenerator等。 12. **事件监听与拦截器** - 实现Hibernate事件监听器,监听对象的生命周期事件。 - 使用Interceptor,自定义逻辑,如对象的预加载、预更新等。...

    SQL代码生成器源码

    1. 数据库模式理解:生成SQL代码前,代码生成器需要解析数据库模式,包括表结构、字段类型、主键、外键和索引等信息。这涉及对SQL标准和各种数据库系统(如MySQL、PostgreSQL、Oracle、SQL Server等)语法的理解。 ...

    Nhibernate配置生成器

    4. **标识符(Id)**:对于主键字段,生成器会特别处理,标记为主键并配置相应的标识策略,如Identity、Sequence等。 5. **映射注解或XML配置**:根据选择,生成器会创建NHibernate所需的映射信息,包括表名、字段名...

    Hibernate 多数据库支持解决方案

    5. **Hibernate主键生成器(数值型主键操作方法)** - Hibernate提供了多种主键生成策略,如`Identity`, `Sequence`, `Table`, `Auto`等。对于数值型主键,应根据目标数据库的特性选择合适的生成策略。例如,Oracle...

    JAVA 的ID生成策略

    在跨不同数据库平台执行代码时,Hibernate会根据不同的数据库管理系统,选择合适的主键生成策略。例如,在SQL Server和Mysql中,使用自动增长字段生成策略,而在Oracle中,使用序列生成策略。 在 ID 生成策略中,...

    代码生成器源代码

    代码生成器是一种软件开发工具,它能够自动化地根据数据库结构生成相应的编程代码,极大地提高了开发效率,降低了出错的可能性。这个“代码生成器源代码”是实现这一功能的具体实现,让我们来深入了解一下这个工具...

    用MyEclipse自动生成hibernate映射文件和实体类

    默认情况下,Hibernate可能会选择自动增长策略,但根据实际需求,可能需要使用`assigned`策略,即主键由应用逻辑生成,例如使用序列或自定义ID生成器。修改后的配置如下: ```xml ``` 这段配置表示主键...

    使用表的id生成

    博文链接提到的是对源码的分析,这可能包括了JPA或其实现(如Hibernate)中主键生成相关类的源代码研究,理解它们如何根据指定的策略生成主键。 6. **工具应用**: 标签中的"工具"可能指的是开发者使用的一些辅助...

    ssh2(struts2+spring2.5+hibernate3.3)自动代码生成器程序

    这个自动代码生成器程序是基于SSH2框架设计的,它能帮助开发者快速生成项目的基础代码,提高开发效率。 Struts2作为MVC框架,负责控制层逻辑,提供了强大的动作调度和结果映射功能。Spring2.5则是一个全面的轻量级...

    java实体类代码生成器 带注释

    生成器可以根据数据库表的结构自动生成这些类,包括主键、外键、非空约束等信息。这使得开发者可以快速地构建数据模型,而无需手动编写大量的基础代码。 使用代码生成器的好处包括: 1. 提高效率:开发者无需手动...

    hibernate注解中的名词解释

    7. **@GenericGenerator**: Hibernate特有的主键生成策略注解,可以指定生成器的名称、策略和参数,支持更灵活的主键生成方式,例如使用UUID、自定义算法等。 在实际开发中,这些注解使得开发者可以不写XML配置文件...

Global site tag (gtag.js) - Google Analytics