hibernate自定义主键要继承TableGenerator
public class IdGenerator extends TableGenerator
要实现generate方法:
public synchronized Serializable generate(SessionImplementor session,
Object obj) throws HibernateException, HibernateException {
//我们一般用long型,所以我这里返回一个long型字段,当然不局限于long型,String或其它类型都可以.
}
代码如下:
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.TableGenerator;
import org.hibernate.type.Type;
import cn.com.s520.leopard.cache.CommonDefine;
public class IdGenerator extends TableGenerator {
static final Logger logger = Logger.getLogger(IdGenerator.class.getName());
private String tableName;
public static long idValue; //数据库存在最大ID记录
public void configure(Type type, Properties params, Dialect d) {
super.configure(type, params, d);
tableName = (params.getProperty("tableName") == null ? "leopard" : params
.getProperty("tableName"));
}
public synchronized Serializable generate(SessionImplementor session,
Object obj) throws HibernateException, HibernateException {
if (idValue > 0) {
long _idValue =idValue;
idValue =0;
return _idValue;
}
Connection conn = session.getBatcher().openConnection();
long nextNo = 1;
String SQL_GETNO = "select nextIntNo from sys_id_serial where tableName = ?";
String SQL_INSERT = "INSERT INTO sys_id_serial (tableName,nextIntNo) VALUES(?,?)";
String SQL_GETNO_UPDATE = "UPDATE sys_id_serial set nextIntNo=? WHERE tableName=?";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(SQL_GETNO);
pstmt.setString(1, tableName);
ResultSet re = pstmt.executeQuery();
if (re.next()) { //数据库存在最大ID记录
nextNo = re.getLong(1) + 1L;
logger.info("nextNo::"+nextNo);
re.close();
pstmt = conn.prepareStatement(SQL_GETNO_UPDATE);
pstmt.setLong(1, nextNo);
pstmt.setString(2, tableName);
pstmt.executeUpdate();
logger.info("SQL_GETNO_UPDATE::"+tableName);
}
else {//数据库不存在最大ID记录 就添加一个初始值
nextNo = CommonDefine.synchronousID;
pstmt = conn.prepareStatement(SQL_INSERT);
pstmt.setString(1, tableName);
//TODO 在线激活方式
pstmt.setLong(2, nextNo); //服务器端设置为1开始
pstmt.executeUpdate();
}
}catch (SQLException e) {
session.getBatcher().abortBatch(e);
e.printStackTrace();
}finally{
if(conn!=null){
try {
session.getBatcher().closeConnection(conn);
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
logger.info("nextNo::"+nextNo);
return nextNo;
}
public static long getIdValue() {
return idValue;
}
public static void setIdValue(long idValue) {
IdGenerator.idValue = idValue;
}
}
分享到:
相关推荐
关于Hibernate的各种主键生成策略与配置详解
1主键常用的生成策略 2对数据库的依赖性总结 3关于主键生成策略的选择 详细解释
Hibernate作为一款流行的Java持久层框架,提供了多种自动生成主键的方法,以适应不同场景的需求。本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique ...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...
5. **配置Hibernate映射文件**:虽然在JPA中可以直接使用注解进行配置,但在一些情况下,你可能还需要为每个实体创建对应的Hibernate XML映射文件,以进一步自定义映射细节。 6. **数据操作**:在实际应用中,你...
### Hibernate主键生成策略 #### 一、概述 在Hibernate框架中,主键生成策略是对象持久化过程中不可或缺的一部分。合理的主键生成机制不仅能够确保数据的唯一性,还能够提高系统的性能和可扩展性。本文将详细介绍...
在Hibernate中,主键(Primary Key)是识别数据库表中每一行记录的唯一标识符。正确配置主键生成策略对于确保数据的完整性和一致性至关重要。以下是对Hibernate主键类型及其配置的详细说明: 1. **uuid.hex**: 这种...
这里的`@Id`注解标记`id`字段为实体的主键,而`@GeneratedValue`注解表示主键生成策略。`GenerationType.IDENTITY`意味着主键值由数据库自动生成,比如在MySQL中,这通常对应于`AUTO_INCREMENT`。 **JPA主键生成...
在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。
assigned策略允许开发者自定义主键生成方式,可以在程序运行时手动设置,但需注意在save()时不会立即生成SQL。 其次,我们来讨论Hibernate的get()与load()方法。两者都是用于根据ID获取对象,但行为有所不同。get()...
- 自定义主键生成策略,如SequenceGenerator、TableGenerator等。 12. **事件监听与拦截器** - 实现Hibernate事件监听器,监听对象的生命周期事件。 - 使用Interceptor,自定义逻辑,如对象的预加载、预更新等。...
在Java的持久化框架中,如JPA(Java Persistence API)和Hibernate,主键生成策略是数据模型设计的重要部分。主键通常是表中唯一标识记录的一列或一组列,用于确保数据的完整性和唯一性。本篇文章将深入探讨JPA的4种...
HQL 是 Hibernate 自定义的一种面向对象的查询语言,类似于 SQL,但更加面向对象。它可以方便地进行对象级别的查询,支持复杂的条件、分组、排序等操作,甚至能实现联接查询和子查询。 五、 Criteria 查询 除了 HQL...
- 可自定义主键生成策略,扩展Hibernate类。 2. **普通属性(property)配置**: - `property`元素用于映射实体类的普通属性。`name`属性对应Java类的字段名,`column`指定数据库列名,其他属性如`access`、`type...
此外,`hibernate-mapping-3.0.dtd`还支持更复杂的映射,如一对一、一对多、多对多的关系映射,以及自定义类型、延迟加载等特性。 在实际应用中,`hibernate.properties`文件是Hibernate 5.0.7版本的配置文件,主要...
总结来说,"Struts2+Hibernate实现新闻发布系统"涉及到的主要知识点包括Struts2的MVC架构、Action和拦截器,Hibernate的对象关系映射、CRUD操作,以及自定义的数据库设计。开发者需要理解这两个框架的基本原理和使用...
9. **事件监听器**:允许自定义事件监听器来扩展Hibernate的功能,如在对象保存或更新时触发某些操作。 10. **类型转换**:Hibernate提供了一系列的类型转换器,用于处理Java类型与数据库类型的转换。 通过学习和...