Hibernate中的关联
1. 单向一对多
主控方一般在“一”的一方,并且cascade设置为“all”
但是执行一次插入操作,会要执行两条sql语句,比如:
User 和 Address的关系,给一个user增加一个address,会执行下面的SQL:
insert into Address(address,zipcode,tel) values('HongKong','410083','1123')
update address set user_id = 1 where id = 7
2. 双向一对多
主控方一般在“多”的一方,并且由多的一方来维持关联,并且只要执行一条SQL语句既可以
3. 多对多关联
通常要借助另外的一张表来保存关联。
并且要根据情况采取延迟加载(Lazy loading)来避免无谓的开销,cascade的值应该设置为“save-update”,因为对于多对多关联,很少出现删除一方需要级联删除所有关联数据的情况。
HQL中的联合查询
1. inner join:将进行连接的表以建立连接的依据为中心,将这些表取交集,交集就是内连接的结果。
作用就是找出在两张表中都有的记录。
2. left outer join
3. right outer join
连接的动作和内连接一样,结果不同。将表进行交集之后,取交集中的记录以及某表中除交集之外的所有记录。包括左连接和右连接。
4. full join
例如:from TUser user inner join fetch user.addresses
fetch关键字的作用:表明TAddress对象读出后立即填充到对应的TUser对象中
Hibernate的持久化实现
实体对象声明周期
1. 自由状态 (Transient)
2. 持久状态 (Persistent)
自由状态的对象通过Session.save方法转换为Persistent状态.如果以一个实体对象与某个
Session实例发生了关联,并处于对应Session的有效期内,那么它就处于Persistent状态
3. 游离状态 (Detached)
处于Persistent状态的对象,其对应的Session实例关闭之后,久处于游离状态
可以通过Session.update方法将游离对象与Hibernate相关联.
从持久状态-->自由状态的转变,一般由session.delete方法完成
VO与PO
VO(Value Object)值对象
PO(Persistence Object)持久对象
二者的区分是由"实体对象是否被纳入Hibernate实体管理容器",非管理对象称VO,而被
管理对象称为PO
VO通常被用作DTO(Data Transfer Object)
而PO则用在MVC模式的模型层
实体对象识别
org.hibernate.engine.Key封装了Hibernate用于区分两个实体对象的识别信息
脏数据检查:一个数据对象所携带的信息发生了改变之后的状态
脏数据检查的一般策略:
数据对象监控:通过拦截器对数据对象的设置方式(setter进行拦截)
数据版本对比:在持久层框架中维持数据对象的最近读取版本
数据缓存
缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝
位于数据库与数据访问层之间
数据缓存策略(三个层次)
事务级缓存: 基于Session生命周期实现的
应用级/进程级缓存: 在SessionFactory层实现,所有有SessionFactory创建的Session实例共享此缓存
分布式缓存: 由国歌应用级缓存实例组成集群,任何一个实例的数据修改操作,将导致整个集群间的数据状态同步
Hibernate数据缓存
内部缓存(Session Level )
二级缓存(SessionFactory Level)