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,没有才从数据库中取

 

Hibernate根据OID区分对象和主键生成策略_第1张图片

Hibernate根据OID区分对象和主键生成策略_第2张图片

二、主键生成策略

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

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

1、increment

Hibernate根据OID区分对象和主键生成策略_第3张图片

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

Hibernate根据OID区分对象和主键生成策略_第4张图片

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

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

Hibernate根据OID区分对象和主键生成策略_第5张图片

 

2、identity

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

Hibernate根据OID区分对象和主键生成策略_第6张图片

Hibernate根据OID区分对象和主键生成策略_第7张图片

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

Hibernate根据OID区分对象和主键生成策略_第8张图片

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

你可能感兴趣的:(Hibernate根据OID区分对象和主键生成策略)