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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值