`
yangzhibin_java
  • 浏览: 51058 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

hibernate 知识点

阅读更多

一,读取缓存(一级缓存,二级缓存)一级缓存可以理解为session对象的一个map

    有很多方法可以往缓存中添加数据,

          往二级缓存添加数据时,save方法不适合native生成方式的主键

    但只有get,load和Iterator能从缓存中读取数据,其他的方法不可以(Query 不能从缓存里去对象)

 

 

    Query,Criteria(查询缓存)由于命中率较低,所以hibernate缺省是关闭;修改cache.use_query_cache true 打开对查询的缓存,并且调用query.setCacheable(true) criteria.setCacheable(true)

 

二,清除缓存(防止内存溢出)

 

    session.evict(obj); ----一条记录(在使用uuid生成策略时。你手动调用该方法会报错

    session.clear();----所有的

 

    sessionFactory.evict(User.class); ----所有的该类型对象

    sessionFactory.evict(User.class,12); ----一条记录

 

    session.flush() --------会发uuid没发的sql语句(在调用evict或clear方法前,先调用该方法)

        作用:可以改变sql语句的执行顺序 (hibernate默认是save,update,delete

 

三,判断对象是否在数据库中存在

    由hbm文件的id配置unsaved-value 決定

 

 

四,二级缓存

    1.hibernate.cfg.xml里配置

        <property name="cache.use_query_cache">true </property>
        <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider </property>

        <class-cache class="yangzhibin.User" user="read-only "/>

 

        usage(策略)取值:

            read-only 效率最高,但是对象不能修改,修改了会报异常(如:省市表)

            read-write:严格的读写(如:银行)

            nonstrict-read-write:不严格的读写(如:帖子的回帖量)效率高点

            transactional:一般缓存没这个功能(jboss-cache实现了,oscache不提供这个功能) 

    2.User.hbm.xml里配置

         <cache usage="read-write "/>

 

 

五,hibernate参数

     1.hibernate.generate_statistics :产生统计信息

           取值:false(默认) ,true

           查看:

                 Statistics st = sessionFactory.getStatistics();

                 System.out.println(st);//查询全部

                 //查看二级缓存统计信息

                 System.out.println("put(放入):" + st.getSecondLevelCachePutCount());
                 System.out.println("hit(命中):" + st.getSecondLevelCacheHitCount());
                 System.out.println("miss(丢失):" + st.getSecondLevelCacheMissCount());

 

六,Session和StatelessSession的区别:StatelessSession 不跟缓存打交道

 

七,Query接口的executeUpdate()(3.0中增加的方法,用于进行批量处理,会把缓存中数据都清空了)

 

八,HQL和Criteria

    1,Criteria查询

          1.1 DetachedCriteria查询 离线查询 (在处理动态查询时很有用)

                 为什么离线呢? 因为它的创建跟session无关,而Criteria的创建跟session有关

DetachedCriteria dc = DetachedCriteria.forClass(User.class);
String name = request.getParameter("name");
if (name != null)
{
	dc.add(Restrictions.eq("name", name));
}
int age = request.getParameter("age");
if(age > 0)
{
	dc.add(Restrictions.eq("age", age));
}
 
Criteria c = dc.getExecutableCriteria(session);//操作还是要通过Criteria来实现
 

       1.2 Example 查询 :根据例子查询

Example.create(obj);
criteria.add(example)
 

九,Iterator查询(先把id都查询出来,再根据id来查询)N+1次查询

 

 

十,SQL和命名查询

 

Query q = session.createQuery(hql);

//sql查询
Query q = session.createSQLQuery("select * from user");//返回对象数组
Query q = session.createSQLQuery("select * from user").addEntity(User.class);//返回User对象list
//命名查询
Query q = session.getNamedQuery("queryUserById");
 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics