`
weigang.gao
  • 浏览: 491092 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ID生成策略(3)

 
阅读更多

id生成策略是什么意思呢?我们原来些的程序是每次id都要我们手工去设定它,手动设定很不方便,很容易重复。在我们实际工作当中我们的数据库表会建成什么样啊?在mysql我一般是用自增字段auto increment,在oracle我们一般是用sequence,所以说如果我把表建成auto_increment,那么我们的实体类(Student)中的id就不用手动去指定它的值了,就需要靠我们的程序或数据库来帮我们生成,hibernate或JPA就已经实现了这样的能力。

 

id可以由generator来生成,而且generator可以有各种各样的具体的值,每个值都指定了不同生成方式,常见的取值如下:

identity

对 DB2,MySQL,SQL server的内置标识字段提供支持。返回的标识符是 long,short 或者 int 类型的。如果用MySQL的话也就是auto_increment

 

sequence:oracle中采用sequence来自动帮我们产生一个id值

 

uuid:如果你想产生一个唯一的,独一无二的id,返回的是一个字符串。注意:数据库应该是字符串

 

native:根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。如果我们使用native的话,在MySQL中就会使用identity,而在oracle中就会使用sequence

 

1.xml生成id

          a) generator

          b)常用四个id生成策略:native identiy sequence uuid

 

2.annotation生成id

@generateValue(注意是javax.persistence.generateValue(在ejb3-persistence.jar里面),而不是使用hibernate的扩展org.hibernate.annotations.Generated。)

如果使用hibernate的扩展org.hibernate.annotations.Generated,就可以使用hibernate自己的id生成策略了,eg,hilo,sequence hilo。

JPA1.0(EJB3中定义的规范)它的id生成策略非常简单,就只有4种,默认的id生成策略是auto,相当于native。如果我们用mysql,它就会用auto_increment;如果我们用oracle,它就会用sequence。

和EJB3相比,hibernate提供更多的id生成器,hibernate的扩展。

 

 

2.1)@generator的默认值AUTO(相当于native)

              i .默认:对MySQL,使用auto_increment

              ii. 对oracle使用hibernate_sequence(名称固定),如果不指定序列的名字,应用程序只会创建一个sequence,即hibernate_sequence。所有的表都共用这个sequence

2.2)@generator指定id生成策略IDENTITY,SEQUENCE.

              1.IDENTITY 在DB2,MySQL,sql server中使用

             @GeneratedValue(strategy=GenerationType.IDENTITY)

              2.SEQUENCE在oracle中使用

               @GeneratedValue(strategy=GenerationType.SEQUENCE)

 

2.3). 指定数据库创建的sequence的名字,oracle中默认的sequence的名字是hibernate_sequence

                i.   @SequenceGenerator


 

2.4) 使用表生成器 @TableGenerator 来生成id

@TableGenerator(

                name="table_seq",

                table="generator_table", //指定创建的表名

                pkColumnName="key",   

                valueColumnName="value",

                pkColumnValue="teacher",   //指定key的Name

                allocationSize=1  //  指定value的初始值value

 

)

会生成如下一个表:

代码中的实现:


 

3.联合主键(2个类之间是组合关系):一般情况下我们能用一个做主键的,就不要用二个做主键

使用annotation有3种方式:

 1.把联合主键类(StudentPK)注解为@Embeddable,并将在实体类(Student)中将联合主键注解为@Id(需要编写联合主键)

 2.在实体类(Student)中将联合主键注解为@EmbeddedId(需要编写联合主键)

 3.第三种方式最符合我们编程的习惯:需要编写联合主键类(StudentPK有2个属性id和name),但联合主键上不需要任何注解。

将实体类(Student)注解为@IdClass(value=”联合主键类.class”)并在实体类中2个主键(id和name)上加@Id,以后load的时候还是要用到联合主键

 

 联合主键:1.StudentPK  implements java.io.Serializable 

为什么要实现Serializable这个接口呢??因为对于Student这条记录在数据库可能存在多条记录,这多条记录如果放到内存中就是多个对象,每个Student中都有一个主键对象StudentPK,如果我们将来系统如果要做集群,好多台服务器共同要对外服务,这台服务器有问题,可以把这台服务器里面的student对象传给另外一台服务器,大家看我是不是要实现序列话呀,要不然我就不能把这台服务器上的student对象传到另一台服务器上了

第二种情况:现在假如我的内存满了,我内存满了的时候我可以使用虚拟内存,把我们内存中的一部分对象转到虚拟内存当中,这个就需要序列话

为什么联合主键要重写equals和hashCode()呢??因为我们不仅要保证这条记录在数据中这条记录唯一,而且要保证在这条记录在内存中唯一,这条记录在内存中唯一,就是通过equals和hashCode来判断的;在数据库中的唯一性是通过联合主键来判断的

     a)  xml:compsite-id

           i 为什么要重写equals和hashCode

 

           ii . 为什么要实现serializable

  • 大小: 29.2 KB
  • 大小: 1.3 KB
  • 大小: 29.4 KB
分享到:
评论

相关推荐

    JAVA 的ID生成策略

    JAVA ID生成策略 JAVA ID生成策略是一种在Hibernate框架中使用的策略,用于生成实体类的主键值。这种策略在Annotation情况下,主要有三种方式生成主键值。 第一种方式是使用数据库的自动增长字段生成。这种方式...

    Hibernate教程02_ID生成策略

    在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...

    分布式ID生成策略_snowflake算法

    分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个数据实体通常都需要一个唯一标识符(ID)来区分其身份。Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用...

    ID生成策略

    ### ID生成策略详解 在软件开发中,尤其是数据库应用领域,如何高效且合理地生成唯一标识符(ID)是至关重要的。本文将详细介绍几种常见的ID生成策略:`sequence`、`native`、`identity`、`foreign`等,并探讨它们...

    java自动生成id策略

    在Java编程中,自动生成ID是一项常见的需求,特别是在数据库记录、分布式系统节点标识等领域。"java自动生成id策略"指的是设计并实现一种机制,确保...实际应用中,还需要根据业务需求和系统规模选择适合的ID生成策略。

    mybatis自定义生成代码策略示例

    在 MyBatis 中,我们可以自定义代码生成策略来满足特定的需求。 自定义 MyBatis 代码生成器涉及到以下几个核心概念: 1. **配置文件**:在 MyBatis Generator(MBG)中,我们首先需要创建一个 XML 配置文件,用于...

    常用Hibernate主键生成策略

    ### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

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

    主键生成策略是Hibernate中一个重要的概念,因为它决定了如何为实体生成唯一的标识符。本文将详细解释Hibernate的几种主键生成策略及其配置。 1. assigned策略 assigned策略允许开发者在保存对象之前手动设置主键。...

    全局唯一ID生成

    在实际应用中,我们可以根据业务需求选择合适的ID生成策略。例如,如果对ID的排序有要求,可以选择基于时间戳的方案;如果对ID长度有严格限制,可以考虑使用ObjectID;如果需要高并发且无特定顺序要求,雪花算法可能...

    使用表的id生成

    标题“使用表的id生成”涉及的是数据库管理和Java Persistence API (JPA) 中的一个关键概念:主键生成策略。在数据库表中,每个记录通常都有一个唯一的标识符,即主键,用于唯一地识别每条数据。在JPA中,有多种策略...

    JPA学习笔记-EJB-03JPA主键生成策略总结

    ### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...

    javaID生成器javaID生成器

    ### Java ID生成器详解 #### 一、引言 在软件开发过程中,特别是在数据库操作时,经常需要为每个新创建的记录分配一个唯一的标识符(ID)。为了满足这一需求,Java 开发者们通常会设计一种高效且可靠的 ID 生成...

    openjpa实体标识的生成策略

    在OpenJPA中,实体标识(Entity Identifier)的生成策略是数据持久化过程中不可或缺的一部分,因为确保实体的唯一性对于数据库的正确性和一致性至关重要。OpenJPA提供了四种不同的策略来生成实体标识,使得开发者...

    基于TkMyBatis的通用Mapper的二次封装 主要讲Id的生成策略

    2. **扩展性**:设计ID生成策略时,考虑其可配置性和可扩展性,让不同的业务模块可以选择不同的ID生成策略。 3. **测试覆盖**:对修改后的代码进行全面的单元测试,确保新功能的正确性和原有功能不受影响。 4. **...

    go-id-builder ID生成器

    2. `watch.go`:这可能是用来监控和响应系统变化的代码,例如,当系统负载变化或新的数据库连接需要时,这个文件中的逻辑可能会自动调整ID生成策略。 3. `model.go`:文件中可能定义了与ID生成相关的数据模型,如...

    分布式ID生成策略(1)_snowflake算法

    分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个请求、每条记录往往都需要一个全局唯一的标识。Snowflake算法就是一种被广泛使用的分布式ID生成方案,它由Twitter开源,具有时间戳、...

    自动生成ID(32位)所用jar

    例如,Snowflake算法是一种广泛使用的分布式ID生成策略,由Twitter开源。它生成的是64位的ID,其中包括时间戳、工作节点ID和序列号,可以保证全局唯一且按时间顺序排序。虽然Snowflake不是Apache Commons Lang的一...

Global site tag (gtag.js) - Google Analytics