hibernate是如何区分两个对象是不是同一个的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate是如何区分两个对象是不是同一个的相关的知识,希望对你有一定的参考价值。

技术分享图片

在数据库中区分两条数据是否是同一条,靠的是主键pk
在jvm中,有一块内存区域叫hibernate内存,jvm中并hibernate内存外面是可以存在多个相同的对象的,区分两个对象是否是同一个对象靠的是地址(object中的equals方法,)在hibernate内存中靠的是什么呢?

oid对象唯一标示符
oid的使用原则:让hibernate使用数据库的能力去维护

Hibernate中定义的主键类型包括:自然主键和代理主键:
自然主键:具有业务含义 字段 作为主键,比如:学号、×××号
代理主键:不具有业务含义 字段作为主键(例如 自增id),比如:mysql自增主键,oracle序列生成的主键、uuid()方法生成的唯一序列串
我一般采用代理主键

在hbm.xml中可以设置的主键生成策略如下:

increment   代理主键。
            由hibernate维护一个变量,每次生成主键时自动以递增。
            问题:如果有多个应用访问一个数据库,由于每个应用维护自己的主键,所以此时主键可能冲突。建议不采用。
            hibernate会先去数据库查询主键是多少,然后再自增,然后给实体类赋值,在去插入,这样就会有线程安全问题,如果两个人在同时插入数据,那么很有可能,有一个人插入失败
identity    代理主键。
                由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql的自增主键,oracle不支持主键自动生成。
如果数据库支持自增建议采用。
sequence    代理主键。
                Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。
如果数据库支持序列建议采用。
native  代理主键。
            根据底层数据库对自动来选择identity、sequence、hilo 
由于生成主键策略的控制权由hibernate控制,所以不建议采用。
uuid    代理主键。
                    Hibernate采用128位的UUID算法来生成标识符。该算法
能够在网络环境中生成唯一的字符串标识符。
此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性。
建议采用。
assigned  自然主键。
        由java程序负责生成标识符。
不建议采用。
hilo    代理主键。
    使用高低位算法生成主键。必须是long、int、short类型。该算法生成的标识符只能在一个数据库中保证唯一。

以上是关于hibernate是如何区分两个对象是不是同一个的的主要内容,如果未能解决你的问题,请参考以下文章

使用 Hibernate 进行不区分大小写的搜索

Hibernate基础学习—对象-关系映射(上)

如何让hibernate映射时字段区分大小写

hibernate 在表名映射时如何保持大小写区分呢?

Hibernate 如何区别 “实体对象” 和 “值对象” ,如何用?

Hibernate对象标识符