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不用再手动的维护了。

你可能感兴趣的:(Hibernate)