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不用再手动的维护了。
分享到:
相关推荐
2. **TABLE(自定义表生成器)** - **概述**:`TABLE`策略通过在数据库中创建一个单独的表来管理主键值。这种方式相对独立于数据库类型,适合需要跨库生成唯一ID的场景。该策略通过`@TableGenerator`注解来配置...
3. **注解**:如`@Entity`表示这是一个Hibernate实体,`@Table`指定对应数据库中的表名,`@Id`标识主键,`@GeneratedValue`处理主键生成策略。 除了实体类,生成器还会自动生成对应的Hibernate映射文件(.hbm.xml)...
总的来说,选择合适的主键生成策略和正确配置是Hibernate成功集成到项目的关键步骤。理解这些策略的差异以及它们如何与不同数据库交互,将有助于优化性能并避免潜在的问题。在实际开发中,应根据项目需求和所使用的...
【标签】:“源码”和“工具”表明这篇内容可能涉及到具体的代码实现和辅助开发的工具,可能是通过某种代码生成器或者IDE插件来实现映射文件的自动化创建。 【压缩包子文件的文件名称列表】:“hibernate映射文件...
6. **第三方库**:在编程语言层面,有许多库和框架提供了主键生成的功能,如Java的Hibernate或Spring框架,它们可以与数据库交互,自动处理主键生成。 使用"SQL主键产生器"工具的优点在于,它可以帮助开发者避免...
自动生成的Entity类通常包含属性(对应表的字段)和getter/setter方法,有时还会包含一些特定的Hibernate注解,如@Id(主键)和@GeneratedValue(主键生成策略)。 2. **映射文件(Mapping Files)**:在传统的...
- **可定制化**:多数实体生成工具允许用户自定义生成模板,比如字段命名规则、注释等。 - **兼容性**:工具通常支持多种数据库,如MySQL、Oracle、PostgreSQL等。 - **版本控制**:随着数据库表结构的修改,工具也...
1. **数据库元数据获取**:实体类生成器首先需要连接到数据库,通过SQL查询获取表的信息,包括表名、字段名、数据类型、主键等。 2. **模板引擎**:生成器通常使用模板引擎,如FreeMarker或Velocity,来定义实体类...
- 自定义主键生成策略,如SequenceGenerator、TableGenerator等。 12. **事件监听与拦截器** - 实现Hibernate事件监听器,监听对象的生命周期事件。 - 使用Interceptor,自定义逻辑,如对象的预加载、预更新等。...
1. 数据库模式理解:生成SQL代码前,代码生成器需要解析数据库模式,包括表结构、字段类型、主键、外键和索引等信息。这涉及对SQL标准和各种数据库系统(如MySQL、PostgreSQL、Oracle、SQL Server等)语法的理解。 ...
4. **标识符(Id)**:对于主键字段,生成器会特别处理,标记为主键并配置相应的标识策略,如Identity、Sequence等。 5. **映射注解或XML配置**:根据选择,生成器会创建NHibernate所需的映射信息,包括表名、字段名...
5. **Hibernate主键生成器(数值型主键操作方法)** - Hibernate提供了多种主键生成策略,如`Identity`, `Sequence`, `Table`, `Auto`等。对于数值型主键,应根据目标数据库的特性选择合适的生成策略。例如,Oracle...
在跨不同数据库平台执行代码时,Hibernate会根据不同的数据库管理系统,选择合适的主键生成策略。例如,在SQL Server和Mysql中,使用自动增长字段生成策略,而在Oracle中,使用序列生成策略。 在 ID 生成策略中,...
代码生成器是一种软件开发工具,它能够自动化地根据数据库结构生成相应的编程代码,极大地提高了开发效率,降低了出错的可能性。这个“代码生成器源代码”是实现这一功能的具体实现,让我们来深入了解一下这个工具...
默认情况下,Hibernate可能会选择自动增长策略,但根据实际需求,可能需要使用`assigned`策略,即主键由应用逻辑生成,例如使用序列或自定义ID生成器。修改后的配置如下: ```xml ``` 这段配置表示主键...
博文链接提到的是对源码的分析,这可能包括了JPA或其实现(如Hibernate)中主键生成相关类的源代码研究,理解它们如何根据指定的策略生成主键。 6. **工具应用**: 标签中的"工具"可能指的是开发者使用的一些辅助...
这个自动代码生成器程序是基于SSH2框架设计的,它能帮助开发者快速生成项目的基础代码,提高开发效率。 Struts2作为MVC框架,负责控制层逻辑,提供了强大的动作调度和结果映射功能。Spring2.5则是一个全面的轻量级...
生成器可以根据数据库表的结构自动生成这些类,包括主键、外键、非空约束等信息。这使得开发者可以快速地构建数据模型,而无需手动编写大量的基础代码。 使用代码生成器的好处包括: 1. 提高效率:开发者无需手动...
7. **@GenericGenerator**: Hibernate特有的主键生成策略注解,可以指定生成器的名称、策略和参数,支持更灵活的主键生成方式,例如使用UUID、自定义算法等。 在实际开发中,这些注解使得开发者可以不写XML配置文件...