1.主键的生成策略
hibenrate负责生成主键:uuid永不重复(企业用的多随机字符串)
数据库底层负责生成主键:native(自动判断使用identity还是sequence)
identity(数据库底层采用自增方式生成主键:mysql支持)
sequence(数据库底层采用序列生成主键:oracle支持)
2.持久化类的编写规则(session操作的实例类的编写规则)
就是生成javabean(更具体)
补充:
1.持久化属性尽可能使用包装类 (如int默认0 不知道是不是复制 而类默认null直接判断是不是复制)
2.实体要有一个oid与表的主键对应(数据中有值的oid)
3.实体类不要使用final修饰 (无法生成代理对象)
3.持久化对象的三种状态
session操作的真正的实体对象
能辨别持久太对象:
瞬时态:没有oid(表中oid有具体值) 与session没有关联
直接获得瞬时态的对象:new
瞬时态--->持久态:save() saveOrUpdate()
瞬时态--->脱管态:setOid(主键值)
持久态:有oid 与sesssion关联(session调用除了close外的方法)
直接获得持久态的对象:get/load
持久态--->瞬时态:delete()
持久态--->脱管态:colse()
脱管态:有oid 与session没有关联(session调用了close())
直接获得脱管态的对象:不能
脱管态--->瞬时态:setOid(null);
脱管态--->持久态:update() saveOrUpdate()
session只是与session无关 但是里面方法还是能直接用(session是会话对象不会随着close()关闭而不能调用对象封装好的访法)
持久太 有自动发送sql的能力(自动更新数据库的能力)
save就是insert
transaction.commit():先发送sql 再提交事务(就是执行sql语句 更新数据库的功能)提交就是更新
4.一级缓存
缓存 就是用时间换空间(就是 将内容存到内存 因为比起查磁盘其更快 关系性数据都是放到磁盘里)
客户端 →服务器端→数据库 服务器端判断缓存中有没有数据然后操作
hibenrate 一级缓存 session中 默认存在
二级缓存 sessionfactory 默认不存在 需要自己配置 (外置缓存 (需要导包) 慢慢被redis替代 )
一级缓存为什么可以自动更新数据库(有自动发送sql语句的功能)?
session有快照机制 (快照就是session里面创造了一份对象副本)
发不发sql 有没有快照
有缓存(缓存里面有对应的那一个对象 如果创建就发送sql 新的快照)就不发sql
存入数据库就发送sql 更新快照
存进数据库就有快照区 如save 插入 submit就是个更新的功能发送sql
5.事务(面试重点)
acid 面试:
原子性(Atomic):表示将事务中所做的操作捆绑成一个不可分割的单元,即对事务所进
行的数据修改等操作,要么全部执行,要么全都不执行。
一致性(Consistency):表示事务完成时,必须使所有的数据都保持一致状态。
隔离性:理想状态 各个事务操作互不影响
持久性:事务已提交 数据就永久性存到数据库磁盘
2.并发问题
脏读:一个事务读取到另一个尚未提交的数据
不可重读:一个事物中两次读取的数据内容不一致(就是事务未提交之前数据不变)
幻读/虚读:一个事物中两次数据的条数不一致
3.通过设置数据的隔离级别