hibernate的一些知识

hibernate的一级缓存
一级缓存指的是session级别 ,缓存机制
1.执行session查询,session不会立即到数据库中查询,而是先到缓存中查询,在缓存中没有找到再到数据库中查询。
2.session负责数据的一致性,数据的一致性值的是缓存中的数据和数据库中的数据保持一致,一旦缓存数据被修改
session负责将数据更新到数据库中。而session在执行事物提交时也就是自动触发了session.flush()方法,session将
数据更新到数据库。

Hibernate为啥要给我们提供延迟加载的机制?
1.可以降低访问数据库的压力

session.get(Class arg0,serializablearg1)
session.load(Class arg0,serializablearg1)
使用Session的get方法会立即触发hibernate的查询语句,而load方法取到的是一个代理对象,当你要取这个对象的属性
时才会触发hibernate的查询语句。


延迟加载是怎么实现?
使用session.get(ClassAarg0,serializable arg1)返回的是ClassA的一个对象
使用session.load(ClassBarg0,serializable arg1)返回的是ClassB动态生成的子类对象。

该子类重写了getValue()方法,在这个方法中实现了延迟加载的工作。
ClassB$$EnhancerByCGLIB$$b3a0560cextend ClassB{
public String getValue(){
//触发数据库的操作
return value;
}
}

具备有延迟加载功能的方法
session.load()
query.iterator()
如果用延迟加载必须使用OpenSessionInView技术,否则在取数据时,session已经关闭了
Hibernate的支持
配置文件中:
thread
然后调用:
essionFactory.getCurrentSession();
自劢实现线程单例


many-to-one默认使用的是延迟加载方式
lazy="false"可以取消所有的延迟加载,但是fetch=="join"却仅对
session.get()起作用,对session.createQuery()不起作用。

主键生成方式 **
常用的主键生成方式有如下几种:
1)   identity  用于自动生成主键方式,除了Oracle不支持,其他数据库一般都支持
(较常用)
2)   sequence  Oracle中使用,用序列生成ID主键
3)   native  主键生成方式如果是native,那就看配置文件hibernate.cfg.xml中
方言是什么,
如果方言是Mysql,相当于identity,如果方言是Oracle,相当于sequence
4)   increment不常用
5)   assigned  不常用,手动生成id

对象的三种状态
暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就立刻消失,被称为暂时态
持久态:持久态的对象和Session发生了关系,如执行了save、get、query等方法
游离态:调用了session.evict(Objectobj)方法,和Session解除了关系


在所有既有的基于外键约束的关联中,
都必须牢记:要么总先持久化主表对应的实体,要么设置级联关联
;否则当hibernate试图插进从表记录时,如果发现该从表记录不存在
那么一定会抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值