Hibernate(four)

//////////2016-12-18 ~ 2016-12-19///////////

int study_data(){

Hibernate条件查询

Criteria/DetachedCriteria

    继承自CriteriaSpecification

Criteria

    对象须由session创建,通常称为在线查询

    支持FetchMode,排序,FlushMode和LockMode

DetachedCriteria

    对象不需要session参与创建,通常称为离线查询

    支持FetchMode,排序

Criterion/Projection

    Croterion是Criteria的查询条件

Criterion的主要实现包括

    Example - 通过一个给定实例,构建一个条件查询

    Junction - conjunction/disjunction实例通过Restrictions

        Conjunction = and

        Disjunction = or

    SimpleExpression

    Projections主要是让Criteria能够进行报表查询,并可以实现分组

    Projections查询返回的是查询结构的数组对象,并不是完整的映射实体对象

Projection的主要实现包括

    Simoleprojection

    ProjectionList

    Property

应用实例:

    Example:

        Criteria.add(Example.create())

    Conjunction:

        Restrictions.conjunction().add()

        Restrictions,disjunction().add()

    SimpleExpression:

        criteria.add(new SimpleExpression(*parentId*,parentId,*=*))

    Projections:

        Projections.projectionList() - 产生projectionList实例

        Projections.Property("propertyName") - 产生属性投影

        Projections.max(),min(),sum()... - 产生聚合函数

        Projections.groupProperty("propertyName") -  对属性进行group by

Restrictions

Restrictions.eq - 等于

Restrictions.allEq - 参数为map,对比多个key/value

Restrictions.gt - 大于

Restrictions.ge - 大于等于

Restrictions.lt - 小于

Restrictions.le - 小于等于

Restrictions.between - 对应SQL的between子句

Restrictions.like - 对应SQl的like子句

Restrictions.in - 对应SQl的in子句

Restrictions.and - and关系

Restrictions.or - or关系

Restrictions.isNull - 判断属性是否为空,为空则返回true

Restrictions.isNotNull - 与isNull相反

Restrictions.sqlRestriction - SQl限定的查询

缓存机制

为了降低应用程序对物理数据源访问的频次,从而体改应用程序的运行性能

一级缓存,又称为"Session的缓存"

默认开启,无法关闭

二级缓存,又称为"SessionFactory的缓存"

可选缓存策略,默认不开启,非线程安全

缓存访问策略

    执行对象查询时,受限查找一级缓存中是否存在对象,存在则返回

    不存在则查询二级缓存中是否存在对象,存在则返回

    不存在则生产SQL提交数据库查询

    由数据库返回内容包装成尸体对象,返回实体对象同时更新缓存

一级缓存

一级缓存管理

管理一级缓存的常用方法

    veit(Object object) - 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为托管状态,从而成为游离对象

    clear() - 将一级缓存中的所有持久化对象清除,释放其占用的内存资源

    contains(Obejct obj) - 判断指定的对象是否存在与一级缓存中

    flush() - 刷新一级缓存区的内容,使之与数据库数据保持同步

二级缓存

适合采用二级缓存管理的数据

    很少被修改的数据

    不是很重要,允许偶尔出现并发的数据

    不会被并发访问的数据

    常量数据

不适合采用二级缓存管理的数据

    经常被修改的数据

    绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发

    与其他应用共享的数据

二级缓存配置(EhCache)

hibernate.conf.xml:

<!-- 设置开启二级缓存 -->

<property name="hibernate.cache.use_second_level_cache">true</property>

<!-- 设置二级缓存插件EhCache的Provider类 -->

<property name="hibetnate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>

<!-- 启动"查询缓存" -->

<property name="hibetnate.cache.use_query_cache">true</property>

ehcache.xml:

<ehcache>

    <!-- 缓存的硬盘的路径 -->

    <diskStore path="C:\Users\tencent\workspace\HibernateDemo\cache" />

    <!-- 默认设置

    maxElementsInMemory : 在内存中最大缓存的对象数据

    eternal                            : 缓存的对象是否永远不变

    timeToIdleSeconds        : 可以操作对象的时间

    timeToLiveSeconds       : 缓存中对象的生命周期,时间到后查询数据会从数据库重新读取

    overflowToDisk               : 内存满了,是否要缓存在硬盘 -->

    <defaultCache maxElementsInMemory="200" eternal="false"

    timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true" />

    <!-- 指定缓存的对象下面出现的属性覆盖上面出现的,没出现的继承上面的 -->

    <cache name="pojo.PlayerStatus" maxElementsInMemory="200"     eternal="false" timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true" />

</ehcache>

annotation:

@Cache(usage = CacheConcurrencyStrategy)

<class>

    ...

    <cache usage="read-writer" />

    ...

</class>

可选的二级缓存(并发)策略

    NONE - 不配置缓存并发策略

    READ-ONLY - 只读

    READ-WRITER - 读写

    NONSTRICT_READ_WRITER - 非严格读写

    TRANSACTIONAL - 事务性

Lifecycle(回调)

Hibernate通过实现Lifecycle接口执行回调,实体对象通过实现Lifecycle接口,就可在特定的持久化阶段执行特定的处理过程

Lifecycle接口方法,抛出CallbackException:

    onSave(Session session):在实体对象save/insert操作之前调用

    onUpdate(Session session):在实体对象update操作之前调用

    onDelete(Session session):在实体对象delete操作之前调用

    onLoad(Session session):在实体对象被加载操作之后调用

对POJO有侵入性

Interceptor(拦截器)

拦截器相关的接口和类

    org.hibernate.Interceptor - Interface

    org.hibernate.EmptyIntercept - Class

设置拦截后,相应的操作都会先穿过一层层相应的拦截器,让拦截器执行预处理或善后处理

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容