- 浏览: 529425 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (339)
- JavaBase (27)
- J2EE (70)
- Database (22)
- Spring (3)
- struts1.x (6)
- struts2.x (16)
- Hibernate (10)
- IBatis (4)
- DWR (1)
- SSH (5)
- Oracle (31)
- HTML (12)
- javascript (11)
- Thinking (3)
- Workflow (5)
- Live (13)
- Linux (23)
- ExtJS (35)
- flex (10)
- php (3)
- Ant (10)
- ps (1)
- work (2)
- Test (1)
- Regular Expressions (2)
- HTTPServer (2)
- 方言 (1)
- 生活 (2)
- Sybase PowerDesigner (0)
最新评论
-
mikey_5:
非常感谢楼主的分享,<parameter propert ...
Check the output parameters (register output parameters failed) IN Ibatis -
影子_890314:
我现在也有这个错误,求解!
Check the output parameters (register output parameters failed) IN Ibatis -
358135071:
学习了,感谢分享!
使用hibernate 代替 mysql 中 limit 進行分頁 -
wjpiao:
你下面的“正确的映射”里面不是还是有number类型吗?
Check the output parameters (register output parameters failed) IN Ibatis -
zh_s_z:
很有用!弄一份吧!
Oracle数据库分区表操作方法
根据hibernate的文档,有两种方式实现实体对象的主键自动增长。
第一种:
设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL,MY-SQL中的自动增长一样,不需要创建触发器,具体的oracle数据库脚本及hibernate配置文件如下:
[1]oracle数据表的创建脚本:
- CREATE TABLE DEPARTMENT (
- ID NUMBER(19 , 0 ) DEFAULT '0' NOT NULL,
- NAME VARCHAR2(255 ) NOT NULL,
- DESCRIPTION CLOB
- );
- ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;
- ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);
- CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
CREATE TABLE DEPARTMENT ( ID NUMBER(19,0) DEFAULT '0' NOT NULL, NAME VARCHAR2(255) NOT NULL, DESCRIPTION CLOB ); ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE; ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME); CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
创建DEPARTMENT表,并为DEPARTMENT表创建一个单独的SEQUENCE,名字为SEQUENCE_ID_SEQ,并不需要创建触发器。
[2]hibernate映射文件的配置:
- <?xml version= "1.0" ?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping package = "com.liyanframework.demo.domain" >
- <class name= "Department" table= "DEPARTMENT" >
- <id name="id" column= "ID" >
- <generator class = "sequence" >
- <param name="sequence" >DEPARTMENT_ID_SEQ</param>
- </generator>
- </id>
- <property name="name" column= "NAME" type= "string" />
- <property name="description" column= "DESCRIPTION" type= "text" />
- </class >
- </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liyanframework.demo.domain"> <class name="Department" table="DEPARTMENT"> <id name="id" column="ID"> <generator class="sequence"> <param name="sequence">DEPARTMENT_ID_SEQ</param> </generator> </id> <property name="name" column="NAME" type="string" /> <property name="description" column="DESCRIPTION" type="text" /> </class> </hibernate-mapping>
在hibernate映射文件中,对ID的生成策略选择sequence,指定sequence的名字DEPARTMENT_ID_SEQ就可以
了,当你保存新对象的时候,hibernate会自动取得DEPARTMENT_ID_SEQ.NEXTVAL作为新对象的ID保存到数据库,所以不需要
再使用触发器再来生成新记录的ID。
[/list]
第二种:
设置ID的增长策略是native,但是需要创建一个名字为
hibernate_sequence(这个名字好像是hibernate默认的sequence名字,不创建会出错的)的全局使用的sequence,
然后再对每一个表的ID生成的时候,使用触发器,取得hibernate_sequence.CURRVAL作为新记录的ID,具体的oracle数据库
脚本及hibernate配置文件如下:
[list]
[1]oracle数据表的创建脚本:
- CREATE TABLE STAFF (
- ID NUMBER(19 , 0 ) DEFAULT '0' NOT NULL,
- NAME VARCHAR2(255 ) NOT NULL,
- AGE NUMBER(3 , 0 ) NOT NULL,
- BIRTHDAY DATE NOT NULL,
- SALARY NUMBER(10 , 2 ) NOT NULL,
- LEVELNESS FLOAT NOT NULL,
- CREATETIME TIMESTAMP NOT NULL,
- ENABLE CHAR(2 ) DEFAULT 'Y' NOT NULL,
- STATUS VARCHAR2(64 ) NOT NULL,
- DEPARTMENT_ID NUMBER(19 , 0 )
- );
- ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE;
- ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE;
- ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME);
- CREATE INDEX IDX_STAFF_STATUS ON STAFF(STATUS);
- CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;
- CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF
- FOR EACH ROW
- BEGIN
- IF INSERTING AND :NEW.ID IS NULL THEN
- SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL;
- END IF;
- END;
CREATE TABLE STAFF ( ID NUMBER(19,0) DEFAULT '0' NOT NULL, NAME VARCHAR2(255) NOT NULL, AGE NUMBER(3,0) NOT NULL, BIRTHDAY DATE NOT NULL, SALARY NUMBER(10,2) NOT NULL, LEVELNESS FLOAT NOT NULL, CREATETIME TIMESTAMP NOT NULL, ENABLE CHAR(2) DEFAULT 'Y' NOT NULL, STATUS VARCHAR2(64) NOT NULL, DEPARTMENT_ID NUMBER(19,0) ); ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE; ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE; ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME); CREATE INDEX IDX_STAFF_STATUS ON STAFF(STATUS); CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE; CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF FOR EACH ROW BEGIN IF INSERTING AND :NEW.ID IS NULL THEN SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL; END IF; END;
创建STAFF表,但是并没有为STAFF创建相应的主键sequence,而是创建了一个名字为HIBERNATE_SEQUENCE的
sequence,然后创建一个触发器STAFF_ID_TRG,当执行INSERT操作时,hibernate会先执行一次
HIBERNATE_SEQUENCE.NEXTVAL,所以在触发器中只需要取得HIBERNATE_SEQUENCE.CURRVAL作为新记录的
ID。
[2]hibernate映射文件的配置:
- <?xml version= "1.0" ?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping package = "com.liyanframework.demo.domain" >
- <class name= "Staff" table= "STAFF" >
- <id name="id" column= "ID" >
- <generator class = "native" />
- </id>
- <property name="name" column= "NAME" type= "string" />
- <property name="age" column= "AGE" type= "integer" />
- <property name="birthday" column= "BIRTHDAY" type= "date" />
- <property name="salary" column= "SALARY" type= "big_decimal" />
- <property name="level" column= "LEVELNESS" type= "float" />
- <property name="createTime" column= "CREATETIME" type= "timestamp" />
- <property name="enable" column= "ENABLE" type= "character" />
- <property name="status" column= "STATUS" type= "string" />
- <many-to-one name="department" column= "DEPARTMENT_ID" class = "Department" />
- </class >
- </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liyanframework.demo.domain"> <class name="Staff" table="STAFF"> <id name="id" column="ID"> <generator class="native" /> </id> <property name="name" column="NAME" type="string" /> <property name="age" column="AGE" type="integer" /> <property name="birthday" column="BIRTHDAY" type="date" /> <property name="salary" column="SALARY" type="big_decimal" /> <property name="level" column="LEVELNESS" type="float" /> <property name="createTime" column="CREATETIME" type="timestamp" /> <property name="enable" column="ENABLE" type="character" /> <property name="status" column="STATUS" type="string" /> <many-to-one name="department" column="DEPARTMENT_ID" class="Department" /> </class> </hibernate-mapping>
在hibernate映射文件中,对ID的生成策略选择native,hibernate会根据你数据库的触发器来生成新记录的ID。
比较两种做法,第二种做法也就是hibernate在代码中,实现了oracle中
的触发器功能。对于不同的情况,选择不懂的做法。如果新的系统,新建的oracle数据库,推荐使用第一种做法,简单,容易移植到其他支持自动增长的数据
库;如果是老的系统,需要把其他数据库转换为oracle的,那就要用第二种了,使用native的方式,可以不改动配置文件,兼容oracle和
mysql之类带有自动增长的数据库。
发表评论
-
windows 启动关闭Oracle监听和服务
2012-01-05 10:28 2521经常要用数据库,让他自己启动的话,开机太慢,所以用命 ... -
入浅出Oracle--DBA入门、进阶与诊断案例
2011-01-18 10:14 1093数据仓库工具箱:维度建模的完全指南(第二版) Oracle ... -
oracle 树形查找
2010-12-02 10:33 695主题:Oracle树查询及相关函数 http://www.i ... -
create oracle DB auto increment PK trigger
2010-10-11 12:05 1021DROP SEQUENCE seq_chat_group_Id ... -
like %abc%
2010-09-09 00:23 1325关键字: oracle 优化 象 ... -
oracle user manager
2010-09-08 10:05 1021创建与管理用户账户 ... -
Oracle Execute Immediate
2010-06-24 23:10 988EXECUTE IMMEDIATE 在某些情 ... -
oracle 常用的sql
2010-06-20 09:16 1041... -
oracle parallel execution example
2010-06-09 23:07 1289引子:以前一直没太关 ... -
Oracle Parallel Query
2010-06-09 23:06 2111Oracle Parallel Query(OPQ)可 ... -
oracle parallel computing
2010-06-09 23:01 1962用Oracle并行查询发挥多C ... -
Oracle数据库分区表操作方法
2010-06-09 22:46 1238文章转自: http://xu20cn.blog.51cto. ... -
Oracle并行服务器(OPS) Oracle Parallel Server
2010-06-09 22:44 1036文章转载自: http://xu20cn.blog.51c ... -
一个简单的Oracle任务
2010-05-13 08:36 746http://www.cnblogs.com/tohen/ar ... -
ORACLE DATE FUNCTION 大全
2010-05-13 00:47 1155TO_DATE格式 Day: dd number 12 ... -
ORACLE DB 定时任务机制
2010-05-13 00:45 1311简介 本文首先简单介绍了Oracle 8的数据复制的 ... -
ORACLE日期时间函数大全
2010-05-12 08:52 1199ORACLE日期时间函数大全 ... -
ORACLE时间处理大全
2010-05-12 08:48 1498... -
paging in oracle
2010-04-10 17:41 689/************************* get ... -
Extract use in oralce
2010-04-09 11:53 943racle中Extract函数的用法 SELEC ...
相关推荐
在Hibernate中实现Oracle的自动增长,实现了oracle中的触发器功能
一下午才整合成功,书中的bulidSessionFactory()方法在hibernate4.3.5中已经deprecated,这里面有方法实现,用完请给好评。
Hibernate实现Oracle中数据的增删改查http://blog.csdn.net/guoquanyou/article/details/6787892
使用hibernate的query调用oracle的存储过程/function,包含例子,源码以及数据库文件
springMVC+hibernate+oracle10g实现用户登陆
结合Struts2和Hibernate3以及Oracle的登录例子,配置很详细
SpringMVC+Spring+Hibernate+Oracle 实现图书管理(CRUD) 一个简单的图书管理系统。
springmvc+hibernate+oracle基础框架,项目源码和数据库脚本(dmp、sql),添加myeclipse中可以直接使用
hibernate链接oracle
HIbernate与oracle数据库应用例子
用struts2+spring+hibernate+oracle编写的一个例子,读者只需在数据库里建一个users表就行,适合初学ssh的的学习
hibernate中使用自定义类型映射Oracle LONG类型
项目模板,Java hibernate JSP mvc分层,Java开发项目基础模型,恳诚下载
在hibernate中调用oracle中的存储过程的详细代码。可以借鉴使用,帮助学习。
hibernate存取oracle的clob
Oracle jdbc Hibernate 驱动
关于hibernate自动增长字段的说明和介绍
SpringMVC+Hibernate+Oracle 实现登录、注册、增删改查,功能齐全,改下数据库配置即可用,绝对能跑通!适合初学者学习成长!
webwork2.1.7+spring+hibernate3+oracle+weblogic8.1登录示例(详解): 通过输入用户名查询出数据库中的对应数据