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
相关推荐
JAVA ID生成策略 JAVA ID生成策略是一种在Hibernate框架中使用的策略,用于生成实体类的主键值。这种策略在Annotation情况下,主要有三种方式生成主键值。 第一种方式是使用数据库的自动增长字段生成。这种方式...
在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...
分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个数据实体通常都需要一个唯一标识符(ID)来区分其身份。Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用...
### ID生成策略详解 在软件开发中,尤其是数据库应用领域,如何高效且合理地生成唯一标识符(ID)是至关重要的。本文将详细介绍几种常见的ID生成策略:`sequence`、`native`、`identity`、`foreign`等,并探讨它们...
在Java编程中,自动生成ID是一项常见的需求,特别是在数据库记录、分布式系统节点标识等领域。"java自动生成id策略"指的是设计并实现一种机制,确保...实际应用中,还需要根据业务需求和系统规模选择适合的ID生成策略。
在 MyBatis 中,我们可以自定义代码生成策略来满足特定的需求。 自定义 MyBatis 代码生成器涉及到以下几个核心概念: 1. **配置文件**:在 MyBatis Generator(MBG)中,我们首先需要创建一个 XML 配置文件,用于...
### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
主键生成策略是Hibernate中一个重要的概念,因为它决定了如何为实体生成唯一的标识符。本文将详细解释Hibernate的几种主键生成策略及其配置。 1. assigned策略 assigned策略允许开发者在保存对象之前手动设置主键。...
在实际应用中,我们可以根据业务需求选择合适的ID生成策略。例如,如果对ID的排序有要求,可以选择基于时间戳的方案;如果对ID长度有严格限制,可以考虑使用ObjectID;如果需要高并发且无特定顺序要求,雪花算法可能...
标题“使用表的id生成”涉及的是数据库管理和Java Persistence API (JPA) 中的一个关键概念:主键生成策略。在数据库表中,每个记录通常都有一个唯一的标识符,即主键,用于唯一地识别每条数据。在JPA中,有多种策略...
### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...
### Java ID生成器详解 #### 一、引言 在软件开发过程中,特别是在数据库操作时,经常需要为每个新创建的记录分配一个唯一的标识符(ID)。为了满足这一需求,Java 开发者们通常会设计一种高效且可靠的 ID 生成...
在OpenJPA中,实体标识(Entity Identifier)的生成策略是数据持久化过程中不可或缺的一部分,因为确保实体的唯一性对于数据库的正确性和一致性至关重要。OpenJPA提供了四种不同的策略来生成实体标识,使得开发者...
2. **扩展性**:设计ID生成策略时,考虑其可配置性和可扩展性,让不同的业务模块可以选择不同的ID生成策略。 3. **测试覆盖**:对修改后的代码进行全面的单元测试,确保新功能的正确性和原有功能不受影响。 4. **...
2. `watch.go`:这可能是用来监控和响应系统变化的代码,例如,当系统负载变化或新的数据库连接需要时,这个文件中的逻辑可能会自动调整ID生成策略。 3. `model.go`:文件中可能定义了与ID生成相关的数据模型,如...
分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个请求、每条记录往往都需要一个全局唯一的标识。Snowflake算法就是一种被广泛使用的分布式ID生成方案,它由Twitter开源,具有时间戳、...
例如,Snowflake算法是一种广泛使用的分布式ID生成策略,由Twitter开源。它生成的是64位的ID,其中包括时间戳、工作节点ID和序列号,可以保证全局唯一且按时间顺序排序。虽然Snowflake不是Apache Commons Lang的一...