`

第三章标识符属性生成策略与对象识别

阅读更多

第三章标识符属性生成策略与对象识别

  • 标识符属性
  • 标识符属性的生成策略
  1.            increment生成策略
  2.            identity生成策略
  3.            sequence生成策略
  4.            hilo生成策略
  5.           seqhilo生成策略
  6.           uuid生成策略
  7.           guid生成策略
  8.           native生成策略
  9.           assigned生成策略
  10.           foreign生成策略

    在 Hibernate 的映射文件 (*.hbm.xml) 中, <id> 元素定义了持久化类的标识符属性的名称,类型和数据库中字段的映射。

   <id> 元素的 <generator> 子元素则用来设置当前持久化类的标识符属性的生成策略

   org.hibernate.idIdentifierGenerator 接口

 

 1.increment生成策略

 

   从数据库表中获取当前主键字段的最大值,然后再最大值的基础上加1,作为当前持久化对象的标识符属性值。(increment是)

<id name="id" type="java.lang.Integer" column="ID">
      <generatory class="increment">
      </generator>
</id>
 

 2.identity生成策略

    在MS SQL Server, MySQL和DB2等数据库中,都可以设置表中某个字段的数值自动增长,都可以设置表中某一个字段的数值自动增长,而identity生成策略就是通过使用这种方式,为当前的记录获取主键值的同时为持久化对象富裕标识符属性值。

<id name="id" type="java.lang.Integer" column="ID">
      <generator class="identity">
      </generator>
</id>

 3. sequence生成策略

  在Oracle,DB2和PostgreSQL等数据库中创建一个序列(sequence),然后Hibernate通过序列为当前的记录获取主键值,进而为持久化对象赋予标识符属性值。

 

<id name="id" type="java.lang.Integer" column="ID">
      <generator class="sequence">
          <param name="sequence">gb_seq</param>
      </generator>
</id>

 4.hilo生成策略

   hilo生成策略采用一种称为高/低位(hi/lo)的高效算法,产生的标识符属性值为long,short,int以及他们封装类的类型。

<id name="id" type="java.lang.Integer" column="ID">
   <generator class="hilo">
     <param name="table">hibernate_key</param>
     <param name="column">next_hivalue</param>
   </generator>
</id>

  5.seqhilo生成策略

 seqhilo生成策略使用的还是高/位算法,产生的标识符属性值为long,short,int以及他们封装的类型。与hilo生成策略不同的是,它使用指定的sequence获取高位值。

<id name="id" type="java.lang.Integer" column="ID">
      <generator class="seqhilo">
          <param name="sequence">hibernate_seq</param>
      </generator>
</id>

  6.uuid生成策略

    uuid生成策略采用128位的UUID算法来生成一个字符串类型的主键值,这个算法使用IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数值(在当前的JVM中唯一)经过计算来产生标识符的属性值,可以用于分布式的Hibernate应用中。

 

<id name="id" type="java.lang.String" column="ID">
       <generator class="uuid">
       </generator>
</id>

  效率很高,但是产生的是字符串类型,所以如果要使用,注意类型要匹配。

 

7. guid生成策略(只支持MS SQL Server & My SQL)

8.native生成策略

  由Hibernate根据所使用的数据库支持能力从identity,sequence或者hilo生成策略中选择一种,其示配置信息如下

<id name="id" type="java.lang.Integer" column="ID">
    <generator class="native">
    </generator>
</id>
 

9.assigned生成策略(由程序员自己控制)

 assigned生成策略由Hibernate应用自主指定标识符属性的数值,也就是说,在调用Session对象的save()方法持久化对象时,需要先对持久化对象的标志符属性赋值。

<id name="id" type="java.lang.Integer" column="ID">
   <generator class="assigned">
   </generator>
</id>

 10.foreign生成策略

   foreign生成策略通过关联的持久化对象为当前持久化对象设置标识符属性值,当处理持久化类一对一关联时,一个持久化类的标识符属性值可以参考关联持久化类的标识符属性值的获取。

   例如:

 

  • 使用主键类映射复合主键

    使用这种方式映射复合主键,持久化类需要使用一个单独的主键类对复合主键进行映射,主键类中的属性就是映射复合主键字段的属性。

 

(oracle中不能建立名为user的表,因为已经存在该表了)

 

 

create table USERS
(
  NAME      VARCHAR2(40) not null,
  BIRTHDATE DATE not null,
  EMAIL     VARCHAR2(200),
  PASSWORD  VARCHAR2(200)
)

  将name和birtDate组合成为一个复合主键。

 

 

package com.crazy;

/**
 * User entity. @author MyEclipse Persistence Tools
 */

public class User  implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	
	private UserId id;
     private String email;
     private String password;

    public User() {
    }

	/** minimal constructor */
    public User(UserId id) {
        this.id = id;
    }
    
    /** full constructor */
    public User(UserId id, String email, String password) {
        this.id = id;
        this.email = email;
        this.password = password;
    }

   
    // Property accessors

    public UserId getId() {
        return this.id;
    }
    
    public void setId(UserId id) {
        this.id = id;
    }

    public String getEmail() {
        return this.email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return this.password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
}
 
package com.crazy;
import java.util.Date;
/**
 * UserId entity. @author MyEclipse Persistence Tools
 */

public class UserId  implements java.io.Serializable {

     private String name;
     private Date birthdate;

    public UserId() {
    }

    
    public UserId(String name, Date birthdate) {
        this.name = name;
        this.birthdate = birthdate;
    }

    public String getName() {
        return this.name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthdate() {
        return this.birthdate;
    }
    
    public void setBirthdate(Date birthdate) {
        this.birthdate = birthdate;
    }
}
 
<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.User" table="USERS" schema="SCOTT">
        <composite-id name="id" class="com.crazy.UserId">
            <key-property name="name" type="java.lang.String">
                <column name="NAME" length="40" />
            </key-property>
            <key-property name="birthdate" type="java.util.Date">
                <column name="BIRTHDATE" length="7" />
            </key-property>
        </composite-id>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" length="200" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="200" />
        </property>
    </class>
</hibernate-mapping>
    

  http://commonclipse.sourceforge.net/download.html

   自动生成hashcode和equal方法的eclipse插件。还需要下载类库:

http://commons.apache.org/lang/

 

分享到:
评论

相关推荐

    实验一_PL/0标识符分析_

    标识符分析是编译器前端的第一步,它主要负责识别并处理源代码中的标识符,确保它们符合语言的命名规则,并建立符号表来存储这些信息。在“实验一”,我们将关注以下几点: 1. **标识符规则**:PL/0语言中的标识符...

    编译原理,简单的词法分析器源代码,能识别标识符部分关键字等

    3. **标识符**:由字母、数字和下划线组成,且第一个字符必须是字母或下划线。用于命名变量、函数等。 4. **数字**:包括十进制、八进制和十六进制形式的整数。 #### 三、词法分析器的设计与实现 给定的代码实现了...

    编译原理龙书答案第三章第四章

    在描述中提到,这份资源可能是针对该书的第三章和第四章的答案,这意味着我们将探讨这两章的核心概念和问题。第三章通常涉及词法分析(Lexical Analysis),这一阶段的任务是将源代码转换为一个个有意义的符号或...

    一维条形码生成与识别技术

    ### 一维条形码生成与识别技术 #### 引言 条形码技术作为一种集条码理论、光电技术、计算机技术、通信技术以及条码印制技术为一体的自动识别技术,在现代社会的应用极为广泛。它通过不同宽度、反射率的条(通常为...

    网络游戏-通过由转发器传输定位标识符和通过更新服务器在通信网络内定位移动通信对象的方法.zip

    定位标识符的传输必须进行加密,以防被恶意第三方截取或篡改。同时,服务器需要有严格的访问控制策略,以保护玩家的个人信息不被泄露。 总结来说,网络游戏中的对象定位技术涉及定位标识符的生成和管理、转发器的...

    编译原理第三版课后习题答案

    第六章 符号表:符号表管理程序中定义的标识符,关联其属性和作用域信息。习题可能要求理解符号表的设计,实现查找和插入操作,或者处理作用域规则。 第七章 运行时的存储组织与分配:这部分讨论了如何在运行时为...

    java生成UUID通用唯一识别码 中文WORD版

    UUID,全称Universally Unique Identifier,是通用唯一识别码的缩写,是一种在不考虑时间空间等外在因素的情况下,能够在全球范围内生成不重复的标识符的技术。在Java中,UUID类提供了生成UUID的能力,这对于分布式...

    java生成UUID通用唯一识别码.docx

    JavaScript中,生成UUID可以借助第三方库如`uuid`,但原生JavaScript并不直接提供生成UUID的API。通常,开发者会使用一些模拟UUID生成的方法,比如生成一个足够大的随机数,然后将其转化为128位的二进制表示,再转换...

    编译原理作业集-第八章

    语法分析阶段,符号表用于关联语法结构与标识符;代码生成阶段,符号表的信息用于确定最终机器码的生成。 6. 常见的符号表构造和处理方法: 对开法(对开式符号表)虽然查找效率高,但实现复杂,且需要额外的存储...

    编译原理:第4章 词法分析.pdf

    词法分析程序的设计是编译程序的第一阶段,主要任务是将源程序分割成一个一个具有独立意义的最小语法单位,即“单词”,并识别出相关的属性,如保留字、标识符、常数、界限符、运算符等。词法分析程序的设计需要考虑...

    编译原理第三版答案,一共有多个PDF

    3. **第三章 词法分析及词法分析程序**:词法分析是编译器的第一步,它将源代码分解成称为“标记”的基本单元。本章可能讲解正则表达式、自动机理论和词法分析器的生成工具,如Flex。 4. **第四章 语法分析和语法...

    javaScript动态随即生成UUID

    在IT领域,尤其是在Web开发中,唯一标识符(UUID)是一种极为重要的技术,它用于确保在分布式网络环境中数据对象的唯一性。JavaScript作为一种广泛应用于Web前端与后端开发的脚本语言,提供了多种方法来生成UUID,...

    编译原理 陈意云 前三章章要点

    ### 第三章:语法分析 1. **上下文无关文法**(CFG):编译器设计中最常用的语言描述工具,用于定义编程语言的句法规则。 2. **上下文无关文法的四种类型**(LL、LR、LALR、LR(1)):不同的分析策略,决定如何从左...

    程序设计第三章答案

    ### 程序设计第三章知识点详解 #### 一、程序设计基础概念 **1. 程序的概念** 程序是一系列有序指令的集合,这些指令定义了一个计算过程,能够解决特定的问题或执行特定的任务。从更深层次的角度来看,程序是由...

    第三章 词法分析1

    《第三章 词法分析1》 词法分析是编译器设计中的重要一环,主要目标是对高级语言的源程序进行结构分析,判断构成源程序的单词是否合法。这一过程与语法分析相辅相成,语法分析则是检查整个程序的合法性。通常,词法...

    第三章-第一讲-1

    本章主要围绕词法分析器的设计与实现展开讨论。 首先,词法分析器有以下几个核心要求: 1. **功能**:词法分析器的功能在于识别输入源程序中的单词符号,如关键字、标识符、常数、运算符和界符,并将其输出为二元...

    一段用VB生成GUID的代码

    本文将详细介绍第二种方法,即通过调用Windows API中的`CoCreateGuid`函数来生成GUID。 #### 三、代码解析 根据给定文件的代码片段,我们可以看到一个VB项目中包含了三个公共函数:`GetGUID`、`SplitGUID`以及`...

    编译原理教案与课后答案(陈火旺第三版)

    3. **第三章_词法分析**: 词法分析是编译器的第一步,它将源代码分解成一个个有意义的符号,即“记号”(Token)。词法分析器(Scanner或Lexer)通常使用正则表达式进行匹配,识别出关键字、标识符、常量和运算符等...

Global site tag (gtag.js) - Google Analytics