Hibernate学习笔记(四)----核心开发接口、对象的三种状态、session常用方法

一、核心开发接口(参考hibernate_0500_CoreAPI

1     Configuration

a)       AnnotationConfiguration

b)       进行配置信息的管理

c)       用来产生SessionFactory

d)       可以在configure方法中指定hibernate配置文件

e)       只关注一个方法即:buildSessionFactory

2     SessoinFactor

a)       用来产生和管理Session

b)       通常情况下每个应用只需要一个SessionFactory

c)       除非要访间多个数据库的情况

d)       关注两个方法即:openSessiongetCurrentsession

                      i.     open session每次都是新的,需要close

                   ii.     getCurrentsession从上下文找,如果有,用旧的,如果没有,建新的。在一个session提交之后使用getCurrentSession会建新的session

1.  用途,界定事务边界

2.  事务提交自动close

3.  上下文配置可参见xml文件中

 <property name="current_session_context_classs">thread</property>

4.  current_session_context_class (jta、thread常用managed、custom.Class少用)

          a) thread 使用connection 但数据库连接管理事务

          b)jta (全称java transaction api)-java分布式事务管理(多数据库访问)

            jta由中间件提供(jboss WebLogic等,tomcat不支持)

 

二、session三种状态


1        三种状态的区分关键在于

a)        有没有ID

b)        ID在数据库中有没有

c)        在内存中有没有(session缓存)

2        三种状态:

a)        transient:内存中一个对象,没ID,缓存中也没有

b)        persistent:内存中有,缓存中有,数据库有(ID)

c)        detached:内存有,缓存没有,数据库有,ID

3        对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比 如改变属性的值会不会发出update语句?

a)        强烈建议动手实验

b)        进行正常人的思考

三、Session

a)管理一个数据库的任务单元(简单说就是增删 改 查

b)方法(CRUD)

                   1)     Save()        session.save(对象);

                   2)     Delete        session.delete(对象);

                   3)     Load      Students1=(Student)session.load(Student.class, 1);

                   4)     Get       Students1=(Student)session.get(Student.class, 1);

                   5)     get与load的区别(面试重点,原理

1.  不存在对应记录时表现不一样

2.  load返回的是代理对象,等到真正用到对象的内容时才发出sql语句

3.  get直接从数据库加载,不会延迟

                   6)     update    session.update(对象);

1.  用来更新detached对象,更新完成后转为persistent状态

2.  更新transient对象会报错

3.  更新自己设定id的transient对象可以(数据库有对应记录)

4.  persistent状态的对象只要设定(如:t.setName…)不同字段就会发生更新

5.  更新部分更改的字段

a)    xml 设定 property 标签的update 属性,annotation 设定@Column 的 updatable属性,不过这种方式很少用,因为不灵活(忘记

b)    使用xml中的dynamic-update,JPA1.0 Annotation 没有对应的属性,hibernate 扩展?

 同一个session可以,跨session不行,不过可以用merge()(不重要

c)     使用HQL(EjBQL)(建议

                   7)     saveOrUpdate()        session.saveOrUpdate(对象);

                   8)     clear()方法           session.clear();

无论是load还是get,都会首先査找缓存(一级缓存),如果没有,才会去数据库査找,调用clear()方法可以强制清除session缓存

                   9)     flush()方法       session.flush();

1. 当session的事务提交后,会强制将内存(session缓存)与数据库同步.默认情况下是session的事务提交(commit)时才同步!

2.  session的FlushMode设置,可以设定在什么时候同步缓存与数据库(很少用)

  例如: session.setFlushMode(FlushMode.AUTO)

               10)     find方法已经过时!

                    i.             SchemaExport (自动建表)

    new SchemaExport(newAnnotationConfiguration().configure()).create(false, true);

                 ii.             Query 接口

a)        参考Hibernate査询(HQLEJBQL)的内容

             iii.             Note:

Hibernate中涉及很多非常非常细节的区别,但在实际应用中用得极少

1)       比如save和persist的区别

2)    merge、evict 等方法

3)    比如 refresh、lock 等

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值