hibernate是如何区分两个对象是不是同一个的-创新互联
天涯网站建设公司创新互联建站,天涯网站设计制作,有大型网站制作公司丰富经验。已为天涯上1000家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的天涯做网站的公司定做!
文章标题:hibernate是如何区分两个对象是不是同一个的-创新互联
分享链接:http://scjbc.cn/article/dsscdi.html
在数据库中区分两条数据是否是同一条,靠的是主键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类型。该算法生成的标识符只能在一个数据库中保证唯一。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
文章标题:hibernate是如何区分两个对象是不是同一个的-创新互联
分享链接:http://scjbc.cn/article/dsscdi.html