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区分对象实例:数据库两条数据
根据代码取得数据
发现只执行两条Hibernate代码,说明取s3的值的时候,并没有从数据库取,而是从session缓存中找有没有相同的OID,没有才从数据库中取
二、主键生成策略
如果数据库建完之后,业务不会经常变动,可以使用业务主键;
假如说业务经常变来变去的话,就使用代理主键,是不具有任何业务性的,仅仅是唯一的标识一条记录的;
1、increment
然后创建新表看主键自增策略
发现Hibernate主键增长方法是:先从数据库找你主键的最大值,然后++,比如你有一条数据是3,新建的数据就是4
而且表中没有自增字段,是因为这是由Hibernate给我们实现自增
2、identity
前提是数据库必须支持自增
这个是由数据库支持,由底层数据库生成的标识符,生成的表是自增的
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是一样的;