今天突然发现了一个问题,用Hibernate的save方法保存数据的时候发现主键没有报错,插不进去。然来记得不用我去自动生成主键的,研究了一下,发现然来都是其它同事都弄好了,对这个自增长主键进行总结了一下:
目前发现有两种方法:
1,通过注解的方式,利用数据库里面创建的sequence自动增长
2,通过写一个spring的OracleSequenceMaxValueIncrementer 类调用sequence 自增长。
第一种:hibernate用注解(annotation)配置sequence
[color=red]注意:@GeneratedValue中的generator不是sequence的名字,而是@SequenceGenerator中的name的名字;@SequenceGenerator中的sequenceName才是定义sequence的名字。[/color]
第二种:
spring配置文件中配置:
springApplicationContextUtil.java
生成主键的方法:
这两个方法的前提是都必须在数据库中配置sequence为名称[color=red]SEQ_INF_BUSINESS_APPOINTDRAW[/color]
对这个的总结不知道有没有用,先留着吧,呵呵
目前发现有两种方法:
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]
对这个的总结不知道有没有用,先留着吧,呵呵