hibernate基础学习

来源:互联网 发布:amarra windows 编辑:程序博客网 时间:2024/06/06 21:51
dos下连接mysql后可执行脚本文件
1:source c:/*.sql
2:\. c:/*.sql

事务的四个特性(ACID):
1.原子性(Atomicity)
2.一致性(Consistency)
3.隔离性(lsolation)
4.持续性(Durability)

hibernate主配置文件hibernate.cfg.xml:
1.配置的key前面的hibernate,前缀,可以有,也可以没有。如

hibernate.dialect或dialect都可以

2.按作用可分为三类:
1)数据库信息
   方言,jdbcurl,驱动,用户名,密码
2)导入映射文件
<mapping resource="com/***/**" />
3)其他配置
<property name="hibernate.show_sql" >true</property>
<property name="hibernate.format_sql" >true</property>

//create :先删除,在创建
//update:表不存在创建,不一样就更新,一样不操作
//create-drop:初始化时创建表。sessionFactory执行close时删除
//validate:验证表结构是否一致,不一致,就抛异常
<property name="hbm2ddl".auto>create</property>//自建表


<property name="name" type="String" cloumn="name"
length="20" not-null="true" />
name属性:对象中的属性名称,必须有
type属性:类型,如果不写hibernate会自动检测
length属性:可以没有,比如vachar有,但int没有,默认255
not-null属性:非空约束,默认false

生成表结构的两种方式:
1.hbm2ddl.auto
2.使用SchemanExport工具类

hibernate工作原理:
1.通过Configuration.configure()读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="xx/xx/*.hbm.xml">读取并解析映射信息
3.通过config.buildSession();//创建SessionFactory
4.sessionFactory.opeSession();//打开session
5.session.beginTransaction;//创建事务Transation
6.persistent operate持久化操作;//一般指save这个方法 
7.session.getTransaction().commit()//提交事务
8.关闭session
9.关闭sessionFactory

hibernate三种状态,也有说是四种状态:
1.瞬态(transient):也叫临时态,特征如下
a)不在Session中,不与任何的Session实例相关联
b)在数据库中没有与之相对应的记录,新new出来的对象
2.持久态
a):在Session缓存中,与Session实例相关联
b)在数据库中存在与之相对应的记录
3.托管态/游离状态
a)不在Session缓存中,不与任何的Session实例相关联
b)不存在Session的缓存中,不与任何的Session实例相关联(前提是没有其他
Session实例删除该记录)
数据库中有相对应记录,但对象不在session管理之中,
修改此状态对象时数据库不会发生变化
4)*删除状态:调用了delete()后的对象

new---->临时状态--save/saveorUpdate-->持久化状态
--session.close/session.clear---->游离状态--delete---删除状态--->垃圾回收
持久化状态<--update/saveorupdate/lock--游离状态
--get/load/queryList-->持久化状态

hibernate5个核心接口:
1.Configuration接口:配置hibenate,根据其启动hibernate,创建SessionFactory对象
1)configure()
2)configure(String resource)
3)addResource(String resource)
4)buildSessionFactory()

5)addClass(Class clazz)

2.SessionFactory接口:初始化hibernate,充当存储源的代理,创建session对象SessionFactory
是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级的二级缓存
1)openSession
2)getCurrentSession

3)colse

3.session:接口:负责保存,更新,删除,加载和查询对象,是一个非线程安全的,避免
多个线程共享一个session,是轻量级,一级缓存
1)save()
2)update()
3)delete()
4)createQuery(String sql)
5)createCriteria(Class)
6)beginTransaction()

7)getTransaction()

4.Transaction接口:管理事务,可以对事务进行提交和回滚
1)commit();

2)rollback();

5.Query和Criteria接口:执行数据库的查询
list();
uniqueResult();查询一个唯一的结果,如果没有结果,则反馈null
如果多个,就抛出异常

Query:hql语句(推荐使用)
Criteria面向对象的构建查询的方法


gt:大于
ge:大于等于
lt:小于

OID:
在关系数据库中称为主键,在对象术语中,则叫做对象标识(object identifier-OID)

对象关系映射文件(hbm.xml):
说明表与对象之间关系

//id元素用于映射主键,子元素
generator是用于指定主键的生成策略
<id name="id">
<generator calss="native">
</id>
*native:根据数据库能力选择,identity\sequence或hilo一种
identity:使用数据库的自动增长策略,不是支持所有数据库,比如oracle
sequence:oracle、postgre sql里使用
hilo:使用高低位算法,会新建一个表
assigned:手工指定主键值
*uuid:由hibernate自动生成uuid
foregin:
increment:会有线程安全问题

值类型的集合
集合元素是普通类型

实体类型的集合
集合元素是另一个实体
多对一:<many-to-one name="" class="" column="" />
一对多: <set name="" table="" cascade="delete"  inverse="true">
<key cloumn=""></key>
<one-to-many name="" class="" column="" />
</set>
<one-to-one>:一种基于主键,一种基于外键

inverse:默认为false,表示本方维护关联关系
如果为true,表示本方不维护关联关系
cascade属性:默认为none;级联删除

lazy属性:懒加载,默认true
true:懒加载,在第一次使用时加载
false:立即生效,在获取本对象时就加载这个集合的所有元素
extra:增强的懒加载策略,
懒加载:
也叫延迟加载,不是在执行获取操作时马上生成sql,
而是在第一次使用时生成sql,分为两种:
类级别的
<class .... lazy="true/false">
属性级别的:
<set/list/map/bag lazy="true/false">
在使用懒加载特性时,可能会有lazyInitializationException异常
原因:
真正去获取数据时,session已经没有了
解决办法:
让session在真正加载后再关闭
或是在session关闭之前执行Hibernate.initialize(user.getName())

维护关联关系
一对多:就是设置外键列的值
多对多:就是插入或删除中间表的记录

操作对象的:
save();
update();
saveorupdate();
delete();
操作缓存的:
session.clear();清空session缓存,不会执行sql
session.flush();清空session缓存,会执行sql
session.evict();
查询实体对象的:
get();
load();
createQuery();
createCriteria();

get()/load():
1.get,立即加载无值返回一个null,load(),懒加载或者延迟加载,无值会发生异常
2.load()返回的是一个代理对象要求类不能为final
否则不能生成子类代理就不能使用懒加载异常(也可在配置文件
中hbm.xml中配置懒加载失效,默认true),get返回的是一个真实对象

session.refresh(user):刷新缓存中对象的状态
 
<property name="connection.isloation" >2</property>
四种事务隔离级別
1.Read Uncommited:读未提交数据(会出现脏读,不可重复读
和幻读)hibernate中表示1
2.read commited:读已提交数据(会出现不可重复和幻读)hibernate中表示2
3.repeatable read(mysql默认级别):可重复读(会出现幻读)hibernate中表示4
4.serializable:串行化(不可并发)hibernate中表示8
脏读:一个事务读取另一个事务未提交的更新数据
不可重复读:在同一事务中,多次读取同一数据返回的
结果有所不同
幻读:一个事务读取到另一事务已提交的insert数据

继承机制 映射:
1:<discrimination//用于鉴别是什么类型的一个列
type="String" column="class_"></discrimination>
子类配置
<subclass name="ClassName" discrimination="ClassName">
<property name=""></property>
<subclass/>

2:<joined-subclass name="" table="">
<key cloumn=""></key>//外键
</joined-subclass>
3:<nuion-subclass name="" table="">
<key cloumn=""></key>//外键
</nuion-subclass>

hibernate检索方式说明:
1,导航对象检索方式,根据已经加载的对象导航到其他对象
2,OID检索方式,按照对象的OID进行检索对象
3,HQL
4,QBC(query by Criteria)检索方式
5,本地sql

session一级缓存:
sessionFactory二级缓存:
应用程序级别的缓存,或者说sesionFactory级别
的缓存,也叫二级缓存。
使用二级缓存,默认是未打开的
1.hibernate.cfgxml:<property name="cache_provider_class">
//选择缓存的使用的类
</property>
2.指定要使用二级缓存的实体类
<class-cache usage="read-writer"
class="com.***.***" />
3.*.hbm.xml中配置
<class-cache usage="read-writer" />

*不管是一级缓存还是二级缓存,都得在使用
OID方式获取数据时有效。
get();
load();

对于query.list不会默认使用缓存想使用可以在
方法后面加iterate();提升性能有限,不太常用

原创粉丝点击