关系型数据库中区分不同记录
- 数据库中用主键来标识唯一性记录。
- 主键必须满足的条件:
不允许null;(不能为空)
每条记录必须有唯一的主键值,主键值不能重复;(不能出现重现)
每条记录的主键值不能改变。(值不能被改变)
- 主键分类:
业务(自然)主键:具有实际意义;
代理主键:没有实际意义。
Java程序中区分不同对象。
- Java语言中通过内存地址区分不同对象;
- 两种比较引用变量方法;
"==" 比较两个变量引用的内存地址是否相同;
equals 比较两个变量引用的对象的值是否相同。
- 用户自定义的类也可以覆盖Object的equals方法实现对象按值进行比较
Hibernate中如何区分对象
- Hibernate 采用对象标识符(OID)区分对象。
- OID 是关系数据库表中的主键(通常是代理主键)在 Java 对象模型中的等价物;
- Hibernate 采用 OID 来维持Java持久化类和数据库表中对应关系;
- Object Identifier。
Hibernate中的OID
- OID 与表中代理主键对应,OID 也是整数类型,Hibernate 允许在持久化类中把OID定义为以下三种类型:
Short
Integer
Long
- 为了保证 OID 的唯一性,通常由 Hibernate 或底层数据库给 OID 赋值。
**## 映射文件中OID的配置
- 在对象-关系映射配置文件中元素的子元素用来设置 OID。
- ** 子元素用来指定OID的生成器。
标识符生成器
- Hibernate 自带了很多种标识符生成器:
1.increment 采用 Hibernate 数值递增的方式;
2.identity 采用数据库提供的自增长方式;
3.assigned 主键由应用逻辑产生;
4.sequence 采用数据库提供的序列方式;
5.hilo 通过hi/lo算法 // Hibernate 5.0 以后不支持;
6.seqhilo 通过hi/lo算法;
7.native 自动选择合适的标识符生成器;
8.uuid.hex 通过uuid算法
- 1.increment标识符适用范围
- increment 标识符:该机制是 Hibernate 以递增的方式为OID赋值。 不依赖于底层数据库系统,适合所有数据库;(不依赖于底层数据库,和它没有关系)
- 适合单独的 Hibernate 应用使用,不适合在集群情况下使用。
increment的主键生成方式:
先查询表中id的最大值
在增加操作时采用的主键是最大值+1
- 2.identity标识符使用范围
- identity 标识符:该机制依赖于底层数据库,需要数据库支持自动增长字段。
例如:MySQL、MSSQL、DB2、Sybase等。
注意:使用identity标识符的主键是自增长的,只要你曾经创建过,
无论是否删除该主键是该主键还是存在的,当你下次继续添加时,
主键依旧是继续自增长式的。
- 3.asgined标识符适用范围
- assigned 标识符:该机制是由外部程序负责生成 OID, Hibernate 不负责维护主键生成,与Hibernate和底层数据库都无关。(需要指定主键的值)
例如: Student 类没有定义 ID,而是以学号 studentNo 作为业务主键。