Hibernate核心开发接口

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语句,第二个是否写入数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xp9802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值