Hibernate根据OID区分对象和主键生成策略

1.数据库用主键作为记录的唯一标识
  自然主键:将含有业务含义的字段作为主键 (学号之类的)
  代理主键:不具备业务含义的字段作为主键 (表的编号之类的)
 
  自动生成代理主键:
  (1)把主键定义为自动增长标识符
  (2)从序列中获取自动增长的标识符

2.Java对象依据内存地址区分对象

  判断方式有两种:

  (1)通过“==”号来判断

  (2)通过.eqauls()方法来判断

  注:equals()方法可以重写,例如String类重来判断内容相同即为同一对象

3.Hibernate根据OID区分对象

  Customer c1 = (Customer)session.get(Customer.class, new Long(1));

  Hibernate根据OID=1查找数据库为1的记录,保存成Customer类型放到session缓存中

  如果再次查找OID=1的信息,则直接从session中获取

  通常是由Hibernate和底层数据库给OID赋值

一、  Hibernate根据OID区分对象实例:数据库两条数据

bb1e1ecb235783d30d0c2e017325b37d9f8.jpg

根据代码取得数据

发现只执行两条Hibernate代码,说明取s3的值的时候,并没有从数据库取,而是从session缓存中找有没有相同的OID,没有才从数据库中取

 

f9fd295481bcdc726488f18e8d9fca0e684.jpg

9972ebfdd29b8be6aa8ac123824c01b6b05.jpg

二、主键生成策略

如果数据库建完之后,业务不会经常变动,可以使用业务主键

假如说业务经常变来变去的话,就使用代理主键,是不具有任何业务性的,仅仅是唯一的标识一条记录的;

1、increment

9660ca0c411b868c40a760475af4079d3c7.jpg

然后创建新表看主键自增策略

593294062a0ac14030676f8a9fd685a48c6.jpg

发现Hibernate主键增长方法是:先从数据库找你主键的最大值,然后++,比如你有一条数据是3,新建的数据就是4

而且表中没有自增字段,是因为这是由Hibernate给我们实现自增

566b01bfd6657a6a6b0daa8322aeb840ef8.jpg

 

2、identity

前提是数据库必须支持自增

5247db3b030a90a5ad461ebf9db244ccd48.jpg

b41b4ac688755ca755e56950f79212c5c15.jpg

这个是由数据库支持,由底层数据库生成的标识符,生成的表是自增的

1d0e0f1c2cd65ba0a0a5fa7f8c1611f075c.jpg

3、sequcence 

前提是数据库必须支持序列

mysql是不支持sequcence的,但是Oracle和DB2支持;

sequcence 由Hibernate 根据底层数据库的序列来生成标识符;适用代理主键;

4、hilo

Hibernate 根据high/low 算法来生成标识符。适用代理主键

5、native

native 根据底层数据库对自动生成标识符的支持能力, 来选择identity,sequence 或hilo;适用代理主键;

比如native 发现你使用的是MySQL数据库就用identity,发现你是用的数据库是Oracle,就使用sequcence 

mysql的native和identity是一样的;

 

 


 

 

 

转载于:https://my.oschina.net/u/3848699/blog/2222726

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值