`
齐晓威_518
  • 浏览: 622779 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Oracle自增序列在Hibernate中的配置方法 (转载)

 
阅读更多

在很多情况下,我们使用Hibernate在已经建立好数据库的基础上。在oracle中,假如已经建立好的数据库中使用了sequence,则可以按照下面的步骤把它引入到Hibernate中:

1、在oracle 首先创建sequence

CREATE SEQUENCE SEQ_ID      
INCREMENT BY 1          
START WITH 1     
NOMINVALUE              
NOMAXVALUE               
NOCYCLE       
NOCACHE      
NOORDER; 

 2.在你的hbm.xml中的配置

 

<id column="ID0000" name="id" type="integer">
      <generator class="sequence">
           <param name="sequence">seq_id</param>
      </generator>
</id>

这样再插入数据的时候,Hibernate回自动生成如下语句

 

hibernate: select seq_id.nextval from dual
hibernate:  insert into YXJK.T_YXJK_WHRYTXL (XM0000, ZW0000, LXDH00, SJHM00, DZYJ00,  IP0000,     ID0000) values (?, ?, ?, ?, ?, ?, ?)?

自动生成下一个序列值,然后将对象插入表中。

 

在使用的时候需要注重,Hibernate对于sequence的主键的要求是一定要是shor,long,或者integer

 

 

hbm.xml配置

  Hibernate中,各表的映射文件….hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具。本节简单的讲述一下这些配置文件的配置。

       配置文件的基本结构如下:

<?xml version="1.0" encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC

                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="包名">

<class name="类名" table="表名">

                  <id name="主键在java类中的字段名" column="对应表中字段" type="类型 ">

                    <generator class="主键生成策略"/>

</id>

         ……

    </class>

</hibernate-mapping>

1. 主键(id

       Hibernate的主键生成策略有如下几种:

1)  assigned

主键由外部程序负责生成,在 save() 之前指定。

2)  hilo

通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。

3)  seqhilo

hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle

4)  increment

主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。

5)  identity

采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。

6)  sequence

采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence

7)  native

由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。

8)  uuid.hex

由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

9)  uuid.string

uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。

10) foreign

使用另外一个相关联的对象的标识符作为主键。

主键配置举例如下:

<id name="id" column="id" type="java.lang.Integer">

             <generator class="native"/>

</id>

另外还可以扩展Hibernate的类来做自己的主键生成策略,具体例子见:http://www.javaeye.com/topic/93391

2. 普通属性(property

       开发人员可以打开网址:http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd

来查看hibernate3.0dtd信息,可看到property的定义如下:

<!ELEMENT property (meta*,(column|formula)*,type?)>
                    <!ATTLIST property name CDATA #REQUIRED>
                    <!ATTLIST property node CDATA #IMPLIED>
                    <!ATTLIST property access CDATA #IMPLIED>
                    <!ATTLIST property type CDATA #IMPLIED>
                    <!ATTLIST property column CDATA #IMPLIED>
                    <!ATTLIST property length CDATA #IMPLIED>
                    <!ATTLIST property precision CDATA #IMPLIED>
                    <!ATTLIST property scale CDATA #IMPLIED>
                    <!ATTLIST property not-null (true|false) #IMPLIED>
                    <!ATTLIST property unique (true|false) "false">
                    <!ATTLIST property unique-key CDATA #IMPLIED>
                    <!ATTLIST property index CDATA #IMPLIED>                                                                                  <!-- include the columns spanned by this property in an index -->
                    <!ATTLIST property update (true|false) #IMPLIED>
                    <!ATTLIST property insert (true|false) #IMPLIED>
                    <!ATTLIST property optimistic-lock (true|false) "true">          <!-- only supported for properties of a class (not component) -->
                    <!ATTLIST property formula CDATA #IMPLIED>
                    <!ATTLIST property lazy (true|false) "false">
    <!ATTLIST property generated (never|insert|always) "never">

       它的各属性中比较常用的有:name(对应的java类的属性名称)、column(对应的表中的字段)、tyope(属性的类型,eg.java.lang.String)、not-null(设置该属性是否为空,为true时表示非空,默认为false)和length(字段的长度限制)

         Eg1. <property name="accessname" column="accessName" type="java.lang.String" not-null="true" />

         Eg2. <property name="state" column="state" type="java.lang.Byte" not-null="true" />

Eg3. <property name="description" column="description" type="java.lang.String" />

3. 一对多关系(<many-to-one…/><set…></set>

       一对多关系一般是用在一个表与另一个表存在外键关联的时候,例如用户表的组织id与组织表存在外键关联,则“一”方为组织表,“多”方为用户表,因为一个组织可以包含多个用户,而一个用户只能隶属于一个组织。

对于存在一对多关系和多对一关系的双方,需要在…hbm.xml中进行相应配置,这时在“一”方(例如:组织)需要在映射文件中添加<set…></set>元素,因为它包含多个“多”方的对象,一般的格式如下:

<set name="java映射类中对应的属性" inverse="true" lazy="true">

<key column="表中对应字段"/>

              <one-to-many class="多方的类"/>

</set>

       Eg.

<set name="userSet" inverse="true" lazy="true">

                  <key column="orgId"/>

<one-to-many class="User"/>

</set>

“多”方(例如:用户)隶属于一个“一”方对象,一般的格式如下:

<many-to-one name="java映射类中对应的属性" column="表中对应字段" class="类名" not-null="true" />

Eg.

<many-to-one name="org" column="orgId" class="Organization" not-null="true" />

4. 一对一关系(<one-to-one…/>

一对一关系相对一对多关系来说比较少见,但也在某些情况下要用到,例如有一个用户的基本信息表(USER)和一个用户的密码表(PASSWD)就存在一对一的关系。下面来看一下一对一关系在Hibernate的配置。

其中主表(eg. 用户的基本信息表)的配置如下:

<one-to-one name="主表对象中子表对象的属性名" class="子表对象的类名" cascade="save-update"/>

Eg. <one-to-one name="password" class="com.amigo.dao.pojo.Passwd" cascade="save-update"/>

子表(eg. 用户的密码表)的配置如下:

<one-to-one name="子表对象中主表对象的属性名" class="主表对象的类名" constrained="true" />

Eg. <one-to-one name="user" class="com.amigo.dao.pojo.User " constrained="true" />

5. 多对多关系(<many-to-many…/>

在数据库设计时,一般将多对多关系转换为两个一对多(或多对一)关系,例如在基于角色的权限系统中,用户和角色存在的关系就是典型的多对多关系,即一个用户可以具有多个角色,而一个角色又可以为多个用户所有,一般在设计时,都会加一个用户与角色的关联表,该表与用户表以及角色表都存在外键关联。

在本小节中讲述的是没有分解的多对多关系在Hibernate中如何配置。设置格式如下:

<set name="java对象的属性名" table="表名" cascade="all" outer-join="false">  

<key column="表的对应字段"/>  

<many-to-many class="另一个表的对象类" column="另一个表的字段"/>  

</set>  

Eg. 上述的多对多关系可以表示为:

t_user方:

<set name="roleSet" table="t_user" cascade="all" outer-join="false">  

<key column="roleId"/>  

<many-to-many class="com.amigo.dao.pojo.Role" column="roleId"/>  

</set>  

t_role方:

<set name="userSet" table="t_role" cascade="all" outer-join="false">  

<key column="roleId"/>  

<many-to-many class="com.amigo.dao.pojo.User" column="roleId"/>  

</set>

6. 完整实例

在本小节中举一些.hbm.xml映射文件的例子,让开发人员对其有一个感性的认识。接下来讲述一个用户表(tbl_user)、用户与角色关联表(tbl_user_role)、角色表(tbl_role)以及组织表(tbl_organization)的例子。

1tbl_user

<?xml version="1.0" encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC

                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.amigo.dao.pojo">

    <class name="User" table="tbl_user">

        <id name="loginname" column="loginName" type="java.lang.String">

            <generator class="assigned"/>

        </id>

 

        <property name="name" column="name" type="java.lang.String" not-null="true" />

        <property name="password" column="password" type="java.lang.String" not-null="true" />

        <property name="mobile" column="mobile" type="java.lang.String" />

        <property name="telephone" column="telephone" type="java.lang.String" />

        <property name="email" column="email" type="java.lang.String" />

        <property name="createtime" column="createTime" type="java.util.Date" not-null="true" />

        <property name="lastlogintime" column="lastLoginTime" type="java.util.Date" />

        <property name="logintimes" column="loginTimes" type="java.lang.Long" not-null="true" />

        <property name="state" column="state" type="java.lang.Byte" not-null="true" />

        <property name="description" column="description" type="java.lang.String" />

 

        <many-to-one name="organization" column="orgId" class="Organization" not-null="true" />

        <set name="userRoleSet" inverse="true" cascade="all-delete-orphan" lazy="true">

            <key column="loginName"/>

            <one-to-many class="UserRole"/>

        </set>

</hibernate-mapping>

2tbl_organization

<?xml version="1.0" encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC

                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.amigo.dao.pojo">

    <class name="Organization" table="tbl_organization">

        <id name="orgid" column="orgId" type="java.lang.Long">

            <generator class="native"/>

        </id>

 

        <property name="parentorgid" column="parentOrgId" type="java.lang.Long" not-null="true" />

        <property name="orgname" column="orgName" type="java.lang.String" not-null="true" />

        <property name="orgfullname" column="orgFullName" type="java.lang.String" />

        <property name="orglevel" column="orgLevel" type="java.lang.Integer" not-null="true" />

        <property name="state" column="state" type="java.lang.Byte" not-null="true" />

        <property name="description" column="description" type="java.lang.String" />

        <property name="creator" column="creator" type="java.lang.String" />

        <property name="createtime" column="createTime" type="java.util.Date" />

        <set name="userSet" inverse="true" lazy="true">

            <key column="orgId"/>

            <one-to-many class="User"/>

        </set>

    </class>

</hibernate-mapping>

3tbl_user_role

<?xml version="1.0" encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC

                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.cotel.netvote.dao.model">

    <class name="UserRole" table="tbl_user_role">

        <id name="urid" column="urId" type="java.lang.Integer">

            <generator class="native"/>

        </id>

        <many-to-one name="role" column="roleId" class="Role" not-null="true" />

        <many-to-one name="user" column="loginName" class="User" not-null="true" />

    </class>

</hibernate-mapping>

4tbl_ role

<?xml version="1.0" encoding='UTF-8'?>

<!DOCTYPE hibernate-mapping PUBLIC

                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="com.cotel.netvote.dao.model">

    <class name="Role" table="tbl_role">

        <id name="roleid" column="roleId" type="java.lang.Integer">

            <generator class="native"/>

        </id>

 

        <property name="rolename" column="roleName" type="java.lang.String" not-null="true" />

        <property name="createdate" column="createDate" type="java.util.Date" not-null="true" />

        <property name="description" column="description" type="java.lang.String" />

 

        <set name="userRoleSet" inverse="true" lazy="true" cascade="all">

            <key column="roleId"/>

            <one-to-many class="UserRole"/>

        </set>

    </class>

</hibernate-mapping>

分享到:
评论

相关推荐

    oracle自增序列

    ### Oracle自增序列知识点详解 在数据库应用中,序列是一种...总之,Oracle自增序列是一种非常实用的功能,在实际开发中有着广泛的应用。掌握如何正确创建和使用序列对于提高数据库应用程序的性能和可维护性至关重要。

    在hibernate中实现oracle的自动增长

    为了在Hibernate中利用Oracle的序列(sequence)特性,需要在Hibernate的映射文件中进行相应的配置。以下是一个示例,展示了如何为`Department`实体类配置序列生成器(sequence generator): ```xml &lt;hibernate-...

    hibernate映射主键生成策略native

    其中,主键生成策略是Hibernate配置中的一个重要部分,它决定了表中的主键值如何生成。本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成...

    hibernate自动增长字段

    首先,我们需要在Oracle数据库中创建相应的表和序列。以下是一个具体的示例: ```sql -- 创建DEPARTMENT表 CREATE TABLE DEPARTMENT ( ID NUMBER(19, 0) DEFAULT '0' NOT NULL, NAME VARCHAR2(255) NOT NULL, ...

    Hibernate 简单使用 hibernate, ppt

    在某些情况下,如Oracle的序列或SQL Server的自增主键,Hibernate会自动适应。然而,基于特定数据库的主键生成方式可能会带来问题,因此推荐使用更通用的方法,如Hibernate的唯一值生成算法(基于IP、JVM启动时间和...

    hibernate注解配置

    - `GenerationType.SEQUENCE`:使用数据库中的序列来生成主键,适用于支持序列的数据库如Oracle。 6. **@SequenceGenerator**:用于定义序列生成器,通常与`@GeneratedValue(strategy = GenerationType.SEQUENCE)`...

    Hibernate主键策略-sequence

    在Hibernate的映射文件或注解中,我们需要配置使用序列来生成主键。对于XML配置,可以在`&lt;id&gt;`标签下使用`&lt;generator&gt;`子标签,指定为`sequence`: ```xml &lt;param name="sequence"&gt;USER_SEQ ``` 对于...

    Hibernate教程02_ID生成策略

    在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一...通过学习这些示例,你可以更好地理解如何在Hibernate中配置和使用不同的ID生成策略,并在实际项目中做出明智的选择。

    hibernate 详细配置

    3. **序列化接口**:实现`Serializable`接口,以支持序列化操作,这对于Hibernate来说是非常重要的,因为它会在内存中缓存对象的状态。 4. **无参构造器**:默认情况下,Hibernate会寻找一个无参数的构造器来实例化...

    hibernate注解中的名词解释

    在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)配置的重要工具。以下是对几个关键注解的详细解释: 1. **@Entity**: 此注解用于标记一个Java类为实体Bean,这意味着这个类的实例将会被持久化到...

    hibernate(api_介绍)

    - **IdentifierGenerator**:这个接口允许定制主键生成策略,比如UUID、自增序列等,以满足不同的数据库和业务需求。 - **Cache**:接口用于定制缓存机制,以提高性能和减少数据库访问。Hibernate支持第二级缓存和...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    这种策略需要在数据库中建立一个额外的表,默 认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi。hilo策略适用于需要高性能的场景,但是它需要额外的表空间。 assigned assigned是一种由程序...

    hibernate的主键生成策略

    这使得它更适合数据库支持序列的环境,如Oracle,但在跨数据库使用时可能需要额外的配置。 5. **identity**: identity策略依赖于数据库的自动增长功能,如MySQL的`AUTO_INCREMENT`或SQL Server的`IDENTITY`。...

    Hibernate各种主键生成策略与配置详解

    increment策略由Hibernate在内存中自增生成主键,不依赖于数据库。它通过查询当前表的最大ID值,然后在内存中递增生成新的主键。由于这个过程不是线程安全的,因此在多JVM环境下可能会导致主键冲突。仅适用于单个...

    hibernate-mapping参数详解

    在 Hibernate 中,为了将 Java 对象映射到数据库表,并实现对象关系映射(ORM),开发者需要定义一系列配置属性来指导 Hibernate 如何进行转换。本文将详细解析 `hibernate-mapping` 文件中的各种关键配置项及其含义...

    hibernate笔记心得

    而在Oracle数据库中,我们通常使用序列(sequence),此时可以设置`GenerationType.SEQUENCE`。还有`GenerationType.NATIVE`,它会根据所使用的数据库自动选择合适的策略。 在XML配置文件中,我们可以通过`&lt;id&gt;`...

    hibernate实体生成工具

    1. **配置Hibernate**:首先需要在项目中集成Hibernate,设置相关的配置文件(如`hibernate.cfg.xml`),包括数据库连接信息等。 2. **选择生成工具**:有很多工具可以选择,例如Hibernate Tools,它集成了在Eclipse...

    Hibernate配置手册.txt

    ### Hibernate配置详解与知识点 #### Hibernate配置核心:`hibernate.cfg.xml` 在Java持久化领域,Hibernate无疑占据着举足轻重的地位。其配置文件`hibernate.cfg.xml`是整个框架运行的基础,用于定义数据库连接、...

Global site tag (gtag.js) - Google Analytics