java学习:Hibernate学习-用oracle sequence序列生成ID的配置示例

上回继续,TMP_EMP中的ID是根据序列SQ_TMP_EMP来生成的,需要在TmpEmp.hbm.xml中设置:

  <id name="id" type="long">
   <column name="ID" not-null="true" sql-type="NUMBER" unique="true"/>
   <generator class="sequence">
    <param name="sequence">SQ_TMP_EMP</param>   
   </generator>
  </id>

这样运行时,Hibernate就会自动从SQ_TMP_EMP中取nextval用来填充到ID字段中

示例代码:

先创建一个工具类

package app;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private HibernateUtils(){

	}

	static SessionFactory sessionFactory;

	/*
	 * 取得Hibernate的Session
	 */
	public static Session getSession(){
		if (sessionFactory == null) {
			sessionFactory = new Configuration().configure().buildSessionFactory();
		}
		return sessionFactory.openSession();
	}

	/*
	 * insert记录
	 */
	public static  boolean addObject(Object obj){
		Session ss = null;
		Transaction ts = null;
		boolean result = false;
		try
		{
			ss = getSession();
			ts = ss.beginTransaction();
			ss.save(obj);
			ts.commit();
			result = true;
		}
		finally{
			ss.close();
		}
		return result;

	}

}

添加记录的类

package app;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import domain.TmpEmp;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Hello {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TmpEmp emp = new TmpEmp();
		emp.setName("张三峰");
		emp.setSalary(new BigDecimal(1000));
		emp.setSex('M');
		emp.setBirthday(new Date(1985-1900,12-1,1));//1985-12-1号
		boolean b = HibernateUtils.addObject(emp);
		if (b){
			System.out.println("插入成功,新记录的ID是:" + emp.getId());
		}
		else{
			System.out.println("插入失败!");
		}

	}

}

运行结果:

Hibernate: select IGSA.SQ_TMP_EMP.nextval from dual
Hibernate: insert into IGSA.TMP_EMP (NAME, BIRTHDAY, SEX, SALARY, ID) values (?, ?, ?, ?, ?)
插入成功,新记录的ID是:210  

 

当然,除用.hbm.xml来配置外,等效的注解方式,可以参考下面的写法:

1     @Id
2     @SequenceGenerator(name="bkdex_seq_generator",sequenceName="SQ_BKD_EX")
3     @GeneratedValue(generator="bkdex_seq_generator",strategy=GenerationType.SEQUENCE)
4     @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
5     public BigDecimal getId() {
6         return this.id;
7     }

基本上这样就行了,但是实际运行会发现sequence每次并不是加1,而是一个其它的数,如果想要每次加1,参考下面这样:

1     @Id
2     @SequenceGenerator(name = "SEQ_ORDER", sequenceName = "SEQ_ORDER", allocationSize = 1)
3     @GeneratedValue(generator = "SEQ_ORDER", strategy = GenerationType.SEQUENCE)
4     @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
5     public BigDecimal getId() {
6         return this.id;
7     }
allocationSize=1 这个是关键
时间: 2024-09-20 00:52:57

java学习:Hibernate学习-用oracle sequence序列生成ID的配置示例的相关文章

【hibernate框架】uuid与native生成ID的样例-XML配置

native算法生成随机id: native 根据底层数据库的能力选择 identity.sequence 或者 hilo 中的一个. native算法指定的字段类型: 用mysql,你需要设置主键bigint, autoincreament (大数,自增) 用oracle,你需要设置主键bigint, sequence  这样才能在hibernate中指定native Student: package cn.edu.hpu.model; public class Student { priva

Oracle sequence序列的入门级教程

sequence含义  Oracle数据库提供了sequence对象,由系统提供自增长的序列号,通常用于数据库数据记录的自增长主键或序号的地方:南京OCM培训  创建语法格式及说明  Create  sequencemysequenc              --自定义序列名称   Increment by 1                                   --设定步长值,即每次增加或减少的等差序列   Start with 1                      

java hibernate-紧急!!:hibernate学习中,数据添加不仅数据库

问题描述 紧急!!:hibernate学习中,数据添加不仅数据库 Exception in thread ""main"" org.hibernate.exception.GenericJDBCException: could not insert: [com.test.hibernate.domain.User] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQL

Java的Hibernate框架中的继承映射学习教程_java

一.继承映射继承是面向对象很重要的特性,它实现了代码的服用,在关系模型中同样也有继承关系,这种继承关系其实可以看做是一种枚举关系,一种类型中可以枚举出很多子类型,这些子类型和父对象形成了继承关系,能够对其进行枚举的大部分都可以看做是一种继承映射,所以这种枚举关系可以看做是继承映射,例如动物就是一种抽象类,它是其它动物猪.猫等的父类,它们之间就是一种继承关系,如下图: 这种继承映射在转化为关系模型后会生成一张表,那么这张表是如何区分这两种类型的呢?用的是关系字段,需要在表中添加类型字段,使用关键字

Java的Hibernate框架中的组合映射学习教程_java

一.组合映射组合是关联关系的一种特殊情况,是关联关系耦合度最高的一种关系,组合的主对象和子对象拥有相同的生命周期,主对像消亡的话子对象也会消亡.这里使用雇主和用户作为示例,用户和雇主都拥有联系方式属性,如果这里站在对象角度思考的话,常常会把对象模型绘制成为组合的方式,抽象出来一个共同的联系方式类,然后两种人分别包含相应的联系方式对象即可,向应的对象模型时它的对象示例如下图所示: 组合对象模型在生成相应的关系模型后会把对应的子类包含到主表中,所以对应的表结构会将相应的属性生成到对应的表中,相应的表

Hibernate学习大全

第1课 课程内容. 6 第2课Hibernate UML图. 6 第3课 风格. 7 第4课 资源. 7 第5课 环境准备. 7 第6课 第一个示例HibernateHelloWorld 7 第7课 建立Annotation版本的HellWorld 9 第8课 什么是O/RMapping 11 一.     定义:. 11 二.     Hibernate的创始人:. 11 三.     Hibernate做什么:. 12 四.     Hibernate存在的原因:. 12 五.     Hi

学习Hibernate Annotation使用实例

 目前,JPA(Java Persistence API)的使用范围越来越广,作为Java EE 5.0平台标准的ORM规范,得到了诸如:Hibernate.TopLink.OpenJpa等ORM框架的支持,同时还是EJB 3.0的重要组成部分.JPA的宗旨是为POJO提供持久化标准规范.它能够脱离容器独立运行,方便开发和测试.本文将通过一个小实例来说明如何在Hibernate中使用JPA,来达到简化编程的目的.     开发环境  Eclipse 3.3.1  MyEclipse 6.0.1G

hibernate学习笔记(三)

hibernate的一些杂记:1.sessionFactory的用法:SessionFactory是线程安全的,构造 SessionFactory 很消耗资源sessionFactory = new Configuration().configure().addClass(**).addClass(**).buildSessionFactory();Session session = sessionFactory.openSession();在这里addClass的好处是不需要在hibernat

适用于Java初学者的学习路线图_java

对于Java初学者来说,想学习Java教程,需要明白,基础打好才能学得更好,Java教程之学习Java的路线图的五个必经阶段,希望能对Java学习者有所帮助. 第一个阶段-java基础阶段 1.java语法 2.面向对象 3.常用的api 4.界面编程 5.多线程 6.文件io 7.java网络编程.. 这是学习java开发的基础阶段,也是以后的学习基石. 第二个阶段-数据库阶段 1.oracle 2.mysql 3.sql server 目前中国软件公司用的最多的三大主流数据库是sql ser