Hibernate核心开发接口
AnnotationConfiguration / Configuration
hibernate.cfg.xml 如果改名了怎么办? new AnnotationConfiguration().configure("修改后的名字").bulidSessionFactory();
SessionFactory 简单理解为 维护数据库连接池的东西,用于产生Session
全局只需一个SessionFactory,把它做成一个单例
getCurrentSession() 跟openSession()
getCurrentSession 跟 openSession 不能混用,混用后getCurrentSessiong 跟 openSession 获得的不是同一个session
getCurrentSession -- i.如果上下文(可以设置,在cfg.xml下,current_session_context_class中设置)已经有了Session,就不用再创建了.
并且不需要close.当commit之后,Session就关闭了,再使用getCurrentSession之后就是一个新的Session了
ii.可以界定事务边界.
(当current_session_context_class用thread的时候,用connection,无异常commit,有异常rollback
当处理分布式事务的时候,只有一个connection不能保证在同一个事务里,需要一个JTATransaction manager
来管理,记录操作,进行回滚(XA driver) 此时使用JTA.
针对一个数据库为connection,多数据库,则为分布式事务,jta(java transaction api)
)
openSession -- 创建一个新的Session,每次调用都创建一个新的Session
共同点:都可以save,commit.
Session
管理一个数据库的任务单元
只用hibernate,要try-catch-finally,跟Spring一起则不用
1) save()
对象有三种状态,Transient,Persistent,Detached.
刚创建的时候,为Transient,save之后为Persistent,当session close之后则为detached.
1.有没有ID 内存中一个对象,全都没有.如果没有ID,则一定为Transient
2.ID在数据库中有没有 数据库中有,缓存中hashmap有,对象也还有.则为Persistent.
3.ID在内存中有没有 数据库中有,缓存中没有.对象还有,则为Detached.
2)delete()
delete之后会变成Transient状态,刚new的不能delete,只要有id号就可以删.
3)load()
session.load(xxx.class,主键),返回值为object,可强制转换成需要的类型.
load出来之后的对象为Persistent状态.当输入主键值不存在的时候,暂时不
会报错.
4)get()
与load方法使用方法一样,但是get方法是立刻发出sql语句,但是用load方法的时候,
并不是直接发出sql语句,它返回的是代理对象,要真正用的时候才发出sql语句
---- 什么是代理对象,动态代理? 这个需要理解.
5)update()
update之后变成Persistent状态,需commit才会写到数据库.
i.由session生成了一个detached状态的对象,如t , 可以t.setName("99"),然后用新创session2,
直接session2.update(t);然后commit().
ii.如果updat一个Transient状态的对象,不行.没有ID,不可update.如果Transient对象
被手动设置了一个id.如T.setId("6"),则可以.
update的时候,会自动把没更新过的字段也更新一遍.
如果一个对象为Persistent状态,不需update方法,直接set,commit的时候会自动更新.
让其不会自动update的方法:
(1)@Column(updatable=false) , 或xml 设置property.update=false;这种方法不用
(2)在xml中 class.dynamic-update设成false;
(3)跨session,设了dynamic-update,当Persistent状态时,改了谁就发谁,detached状态的时候
就全部update.想不自动update,用merge()方法代替update()方法.其实merge()方法会先load出来
然后变成Persistent状态,再做update.
(4)用hql语句.
6)saveOrUpdate()
根据状态来判断使用save或者update.
7)clear()
把缓存里的数据强制清除.get/load方法执行前都会去缓存中查找,存在则不用再从数据库中取出
8)flush()
把缓存里的数据强制写入数据库,当session.getTransaction().commit()执行的时候,会自动执行flush();
SchemaExport
xml可以不设自动生成表,可以用该方法生成
1) create(true,true) 第一个参数为是否打印ddl语句,第二个是否写入数据库
Hibernate核心开发接口
最新推荐文章于 2017-10-21 10:33:25 发布