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]

對這個的總結不知道有沒有用,先留着吧,呵呵
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章