Hibernate 主键自增长

今天突然发现了一个问题,用Hibernate的save方法保存数据的时候发现主键没有报错,插不进去。然来记得不用我去自动生成主键的,研究了一下,发现然来都是其它同事都弄好了,对这个自增长主键进行总结了一下:
目前发现有两种方法:
1,通过注解的方式,利用数据库里面创建的sequence自动增长
2,通过写一个spring的OracleSequenceMaxValueIncrementer 类调用sequence 自增长。

第一种:hibernate用注解(annotation)配置sequence
 @SequenceGenerator(name="sequenceGenerator",sequenceName="SEQ_INF_BUSINESS_APPOINTDRAW")
@GeneratedValue(generator="sequenceGenerator",strategy=GenerationType.SEQUENCE)
public long getId() {
return this.id;
}

public void setId(long id) {
this.id = id;
}

[color=red]注意:@GeneratedValue中的generator不是sequence的名字,而是@SequenceGenerator中的name的名字;@SequenceGenerator中的sequenceName才是定义sequence的名字。[/color]

第二种:
spring配置文件中配置:
<!-- 提供普java类获取spring上下文 通过上下文获取具体bean,调用其中的方法 -->
<bean id="springApplicationContextUtil" class="com.tienon.hfms.common.SpringApplicationContextUtil" lazy-init="false"></bean>
<!-- 根据Oracle数据库序列获取NEXTVAL 值从1开始到99999999999 -->
<bean id="oracleSequenceGenerator"
class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer">
<property name="dataSource" ref="dataSource" />
<property name="incrementerName">
<value>SEQ_INF_BUSINESS_APPOINTDRAW</value>
</property>
</bean>


springApplicationContextUtil.java
package com.tienon.hfms.common;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
* @Description:提供供普通java类获取spring上下文 通过上下文获取具体bean,调用其中的方法。
* @Copyright: Copyright 2011 ShenZhen DSE Corporation
* @Company: 科技有限公司
* @author: liulm
* @Date: 2011-5-17
* @version 1.0
*/
public class SpringApplicationContextUtil implements ApplicationContextAware {

private SpringApplicationContextUtil(){}
//声明一个静态变量保存
private static ApplicationContext context;

@SuppressWarnings("static-access")
public void setApplicationContext(ApplicationContext context)throws BeansException {
this.context = context;
}

public static ApplicationContext getContext(){
return context;
}
public static Object getBean(String beanName){
if (StringUtils.isEmpty(beanName)) {
return null;
}
return getContext().getBean(StringUtils.trim(beanName));
}
}


生成主键的方法:
public static Long getOracleSequence() {
// OracleSequenceMaxValueIncrementer seq = (OracleSequenceMaxValueIncrementer)SpringUtil.getBean("oracleSequenceGenerator");
ApplicationContext context = SpringApplicationContextUtil.getContext();
OracleSequenceMaxValueIncrementer seq = (OracleSequenceMaxValueIncrementer) context.getBean("oracleSequenceGenerator");
return seq.nextLongValue();
}


这两个方法的前提是都必须在数据库中配置sequence为名称[color=red]SEQ_INF_BUSINESS_APPOINTDRAW[/color]

对这个的总结不知道有没有用,先留着吧,呵呵
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值