`
weishuwei
  • 浏览: 325982 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate自定义主键

阅读更多

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;
 }
}
 

分享到:
评论
2 楼 limeiyong 2009-06-12  
定义后怎么用?
1 楼 wxyhibernate 2008-12-01  
学习~~~~~~~~~~~~~~~

相关推荐

    Hibernate各种主键生成策略与配置详解

    关于Hibernate的各种主键生成策略与配置详解

    总结hibernate常用主键生成策略。

    1主键常用的生成策略 2对数据库的依赖性总结 3关于主键生成策略的选择 详细解释

    hibernate中自动生成主键的办法

    Hibernate作为一款流行的Java持久层框架,提供了多种自动生成主键的方法,以适应不同场景的需求。本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique ...

    hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...

    hibernate 主键一对一映射(单向) 实例(java类)

    5. **配置Hibernate映射文件**:虽然在JPA中可以直接使用注解进行配置,但在一些情况下,你可能还需要为每个实体创建对应的Hibernate XML映射文件,以进一步自定义映射细节。 6. **数据操作**:在实际应用中,你...

    Hibernate主键生成策略

    ### Hibernate主键生成策略 #### 一、概述 在Hibernate框架中,主键生成策略是对象持久化过程中不可或缺的一部分。合理的主键生成机制不仅能够确保数据的唯一性,还能够提高系统的性能和可扩展性。本文将详细介绍...

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

    在Hibernate中,主键(Primary Key)是识别数据库表中每一行记录的唯一标识符。正确配置主键生成策略对于确保数据的完整性和一致性至关重要。以下是对Hibernate主键类型及其配置的详细说明: 1. **uuid.hex**: 这种...

    JPA环境搭建及JPA实例与JPA主键生成策略

    这里的`@Id`注解标记`id`字段为实体的主键,而`@GeneratedValue`注解表示主键生成策略。`GenerationType.IDENTITY`意味着主键值由数据库自动生成,比如在MySQL中,这通常对应于`AUTO_INCREMENT`。 **JPA主键生成...

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。

    hibernate难点重点笔记

    assigned策略允许开发者自定义主键生成方式,可以在程序运行时手动设置,但需注意在save()时不会立即生成SQL。 其次,我们来讨论Hibernate的get()与load()方法。两者都是用于根据ID获取对象,但行为有所不同。get()...

    hibernate v3.04中文参考手册

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

    持久化类主键生成策略+例子

    在Java的持久化框架中,如JPA(Java Persistence API)和Hibernate,主键生成策略是数据模型设计的重要部分。主键通常是表中唯一标识记录的一列或一组列,用于确保数据的完整性和唯一性。本篇文章将深入探讨JPA的4种...

    hibernate3中文官方文档

    HQL 是 Hibernate 自定义的一种面向对象的查询语言,类似于 SQL,但更加面向对象。它可以方便地进行对象级别的查询,支持复杂的条件、分组、排序等操作,甚至能实现联接查询和子查询。 五、 Criteria 查询 除了 HQL...

    hibernate.hbm.xml详解

    - 可自定义主键生成策略,扩展Hibernate类。 2. **普通属性(property)配置**: - `property`元素用于映射实体类的普通属性。`name`属性对应Java类的字段名,`column`指定数据库列名,其他属性如`access`、`type...

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    此外,`hibernate-mapping-3.0.dtd`还支持更复杂的映射,如一对一、一对多、多对多的关系映射,以及自定义类型、延迟加载等特性。 在实际应用中,`hibernate.properties`文件是Hibernate 5.0.7版本的配置文件,主要...

    Struts2+Hibernate实现新闻发布系统

    总结来说,"Struts2+Hibernate实现新闻发布系统"涉及到的主要知识点包括Struts2的MVC架构、Action和拦截器,Hibernate的对象关系映射、CRUD操作,以及自定义的数据库设计。开发者需要理解这两个框架的基本原理和使用...

    hibernate-release-5.2.10

    9. **事件监听器**:允许自定义事件监听器来扩展Hibernate的功能,如在对象保存或更新时触发某些操作。 10. **类型转换**:Hibernate提供了一系列的类型转换器,用于处理Java类型与数据库类型的转换。 通过学习和...

Global site tag (gtag.js) - Google Analytics