想着做个项目,奈何前端是我的弱项,只会写一下div+css,好不容易写好了,发现css引不进入,老是报错,说什么路径不对,一气之下,我就css样式改成了内联式。
忙活了一上午,想实现保存客户的功能,可就是有一点出bug了,servlet老是跳不过去,一直在报404的错误,
只好放弃,回头再想,现在继续往下学。
hibernate的第二天。
引入一个概念:持久类:就是javabean+XXX.hbm.xml
就是注意在生成javabean的类时,要配置xml文件,以及核心的xml文件。
最后就是主键的问题,
UUID,则自动生成主键,此主键是字符串类型,而且较长。
native则是自动递增。属于int型。
一般推荐这两种。
对象的三个状态:瞬时态--》持久态--》脱管态
这就是瞬时态,无主键ID,无session。(黑户)
这是持久态,有主键,有session。
这是脱管态,有id,无session。(丧偶)
持久态对象有自动更新数据库的能力。
为什么会这样?
为什么持久态对象由自动更新数据库的能力?
因为session的一级缓存。
那么。问题来了,什么是缓存?
缓存就是在内存中开辟一片空间,将数据放在其中,再次获取的时候可以直接拿,就提高了程序的性能。
hibernate支持二级缓存,一级缓存是session,session的底层是集合链表 list。二级缓存是sessionfactory。
但是二级缓存需要手动连接,多个session可以共享数据。
session的以及缓存可以证明。
另外一种证明方式,就是两次查询同一个对象,然而显示一条SQL语句。
那么?为什么还要有session.update();呢?
事务是一组操作,要么同时成功。要么同时失败。
事务的特性:原子性:事务不可分割
一致性:操作前后保持数据完整。
隔离性:事物之间相互隔离,不可干扰。
持久性:事务一旦提交,数据永久保持。
如果不考虑隔离性,则会引发一些读的问题:①脏读:一个事务读到了另一个事务没提交的数据
②不可重复读:一个事务读到了另一个事务已经提交的update数据,导致查询结果不一致。
③:虚读:一个事务读到了另一个事务已经提交的insert数据,导致查询结果不一致。
如何解决这些问题?
通过设置数据库的隔离级别。
未提交读:什么都可能发生
已提交读:避免了脏读,但是虚读和不可重读可能发生
可重复读:避免了脏读,不可重复读,但虚读可能发生。
串行化:最安全,啥都能隔离。
在hibernate中,有默认的隔离级别
可以通过代码来改动隔离级别,在hibernate.cfg.xml中,<property name="hibernate.connection.isolation">1/2/4/8</property>
一般mysql默认4,oracle默认2.
乐观锁中,在javabean中添加一个属性:private Integer verson;并且在在实体类配置文件中加上<version name="verson"/>