您的位置:首页 > 其它

08hibernate hibernate的核心开发接口介绍及三种对象状态(重点)

2014-07-03 10:37 411 查看
1.Configuration
a.包括AnnotationConfiguration
b.进行配置信息的管理
c.用来产生SessionFactory
d.可以在configure方法中指定hibernate配置文件
sessionFactory =
new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory();
//默认寻找hibernate.cfg.xml
e.只需要关注一个方法:buildSessionFactory()
SessionFactory产生一个session的时候,会分配一个连接给session


2.SessionFactory
a.用来产生和管理session
SessionFactory里面最重要的就是维护数据库连接池
b.通常情况下每个应用只需要一个SessionFactory,所以SessionFactory是单例
c.除非要访问多个数据库的情况
d.关注两个方法:openSession getCurrentSession
区别:
Session session = SessionFactory.getCurrentSession();
//必须设定上下文,如果当前的上下文里没有session就创建,有的话就直接获取
//session一旦提交,再拿就是新的session
//事务提交自动close
//用途:界定事务边界
Session session = SessionFactory.openSession();
//永远是创建新的session
//需要close

补充知识:什么叫“上下文”?
<property name="current_session_context_class">thread</property>
上下文的取值:
1.jta(java transaction api,常用)
分布式事务(分布在多台不同的数据库服务器上)使用一个connection是不够的
是ApplicationServer提供的事务管理器,运行需要ApplicationServer的支持
2.thread(最常用)//当前线程
thread的事务就是数据库的单独连接,及一个connection,从数据库界定事务
3.managed(ApplicationServer手动管理,很少用)
4.custom.class

试验:先openSession(),再getCurrentSession(),
此处的两个session不是同一个,为什么?
原因:session是一个接口,而两个方法获取的session的具体实现类是不同的,
两者不能混用


<pre name="code" class="java">3.Session(重点)
a.管理一个数据库的任务单元
b.方法(CRUD)
i.  save()
save()方法的实质:
new一个对象之后,先在内存的session对象产生一个引用指向该对象
此时session中就保存了对象,事务提交后就保存在数据库中了
ii.	delete() 缓存里也就没有了,操作的对象必须有id,对象变成transient
iii.update() 1.用来更新detached对象,更新完成后转为persistent状态
2.更新transient对象会报错
3.更新自己设定id的transient对象可以(数据库有对应记录)
4.persistent状态对象只要设定不同字段就会发生更新
5.更新部分更改的字段
a.xml设定property标签的update=true|false,
annotation设定@Column(updatable=false),很少用,不灵活
b.使用xml中的dynamic-update="true",JPA1.0 Annotation没有对应的属性
//同一个session可以,跨session不行,
//不过可以用merge(),意思是合并(不重要)
c.建议使用HQL
//Query q = session.createQuert("update Student s set s.name = 1");
//q.executeUpdate();
iv.	saveOrUpdate()
v.	load()//如:Teacher t = (Teacher)session.load(Teacher.class,1);
//1是id,类型为Integer,所有实现了序列化
//此时t是persistent状态的
vi.	get()//Teacher t = (Teacher)session.get(Teacher.class,1);
vii.find方法已经过时
viii.get与load的区别(重点)
1.不存在对应记录时,两者表现不一样,
load不会报错(因为没有发出sql语句),而get会报错
2.load返回的是代理对象,等到真正用到对象的内容时才发出sql语句
是不是代理对象可以通过t.getClass()方法来检测
3.get直接从数据库加载,不会延迟
ix.		clear方法
//无论是load还是get,都会首先查找缓存(一级缓存),
//如果没有,才会去数据库查找
//调用clear()方法可以强制清除session缓存
x.		调用flush()方法
1.强制进行从内存到数据库的同步,默认提交的时候同步
2.可以通过设置flushMode来选择flush的时机
//session.setFlushMode(FlushMode.AUTO)

必备知识点:
对象的三种状态
1.对象的三种状态图解(见下图)
2.三种状态的区分关键在于:
a.有没有ID(没有id,一定是Transient)
b.ID在数据库中有没有
c.在内存中有没有(session缓存)
//缓存:放在内存中的,可以提高访问效率的数据
//个人理解1:一级缓存一定存在于session中,一旦session关闭就不存在一级缓存
//个人理解2:不同session获取数据库的同一个数据所得到的对象不是同一个,
//因此在各自的session中的持久化状态就不同

3.三种对象:
a.transient:内存中有一个对象,没有id,缓存中也没有
b.persistent:内存中有,缓存中有,数据库有(id)
c.detached:内存有,缓存没有,数据库有,有id

4.SchemaExport 可以在程序里面控制生成建表语句
new SchemaExport(new AnnotationConfiguration().configure()).create(true,true);
//第一个true打印sql语句,第二个true到数据库执行sql
效果相当于<property name="hbm2ddl.auto">update</property>

5.Query接口








                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: