1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 基于Oracle 采用JDBC Hibernate不同方式实现自定义序列主键生成

基于Oracle 采用JDBC Hibernate不同方式实现自定义序列主键生成

时间:2024-05-10 18:14:51

相关推荐

基于Oracle 采用JDBC Hibernate不同方式实现自定义序列主键生成

数据库|mysql教程

Oracle教程,基于Oracle,采用JDBC、Hiber

数据库-mysql教程

景安代理源码,ubuntu磁盘卸载软件,人才网爬虫,include php,seo教育心得lzw

当然有了以上的条件之后你就可以利用oracle方言结合jdbc中的方式进行插入。形式如:insert into test(nid,test1) values(seq_tes

ui界面 源码,vscode免密登录服务器,ubuntu 拖动语言,树莓派自启tomcat,使用爬虫攻击,php源码加密解密,鼓楼区企业seo大概费用lzw

锁屏显示源码,ubuntu的桌面美化,tomcat名称是原来的,爬虫怎么解密,php书本推荐,三水关键词seo优化代理lzw

JDBC自增长主键

–首先建一个表TEST

create table TEST

(

NID varchar2(20) PRIMARY KEY,

test1 varchar2(20),

)

— 再建一个序列SEQ_TEST

create sequence SEQ_TEST

minvalue 1–最小值

nomaxvalue –不设置最大值

start with 1 –从1开始计数

increment by 1 –每次加1个

nocycle–一直累加,不循环

nocache ; –不建缓冲区

当然有了以上的条件之后你就可以利用Oracle方言结合jdbc中的方式进行插入。形式如:

insert into test(nid,test1) values(seq_test.nextVal,’test1′);就是手动方式保证序列的增长,这种方式生成的序列并不是自定义的。当然我们在程序中不会利用这样的方式,是否可以直接插入其他字段,,而逻辑主键交由数据库来自动生成呢?答案是肯定的,但只有了表和序列还不够,我们需要建立一个对应触发器来执行它!代码如下:

CREATE OR REPLACE TRIGGER tg_test

BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null)

begin

select to_char(sysdate,’yyyymm’)||substr(‘00000’,0,5-length(seq_test.nextval))||seq_test.currval into:new.nid from dual;

end;

/

下面是测试

select * from test

insert into test(nid,test1) values(6,’aaa’)

insert into test(test1) values(‘bbb’); –这条语句将会自动生成自定义主键,即插入其他字段,主键在插入记录前自动生成

select * from test;–查看表数据

Hibernate中自定义主键生成方式:

如果你想在Hibernate中自定义主键生成方式,以上的例子就不一定能够使用。Hibernate提供了多种主键生成方式,方式对应了各种实现类。如果我们要自定义主键生成方式就必须实现相关类。例如:

Company.hbm.xml

SEQ_Company

以上SEQ_Company将会由hibernate自动生成,和表类似。我们关心的是com.panySequenceGenerator类如何实现???

package com.sunyou.sequenceGenerator;

import java.io.Serializable;

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.SequenceGenerator;

import org.hibernate.type.Type;

public class CompanySequenceGenerator extends SequenceGenerator {

private static final int idLength = 12;//本长度与数据库ID字段长度一致

public CompanySequenceGenerator(){

}

public void configure(Type type, Properties params, Dialect dialect){

super.configure(type, params, dialect);

}

public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {

String sequence = String.valueOf(super.generate(session, obj));

int prefixLength = idLength-sequence.length(); //计算得到的主键长度

for(int i=0;i<prefixLength-3;i++){//不够长度则用0补足前缀

sequence = “0” + sequence;

}

sequence = “CPI” + sequence; //这边产生的主键将会是CPI000000001、CPI000000002、CPI000000003形式

return sequence;

}

}

以上的方式中采用的是String类型来定义sequence,不过作者建议采用StringBuffer,首先是因为一般主键可能比我们定义的要长,单是补足前缀就会生成多数的String对象,要是遇上批量插入,那就是几十万、几百万数据的插入,对于系统资源的浪费是可想而知的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。