hibernate补充问题

=========================================================================================================
    hibernate.cfg.xml和hbm.xml内容解释
=========================================================================================================

数据类型:
1、<property name="name" type="java.lang.String" />
type可以是hibernate、java类型或者你自己的类型(需要实现hibernate的一个接口)。
2、基本类型一般不需要在映射文件中说明,只有在一个java类型和多个数据库数据类型相对应时并且你想要
的和hibernate缺省映射不一致时,需要在映射文件中指明类型(如:java.util.Date,数据库Date,Time,
DataTime,Timestamp,hibernate缺省会把java.util.Date映射成Datatime型,而如果你想映射成TIme,
则你必须在映射文件中指定类型)。
3、数据类型的对应关系

Session是非线程安全的,生命周期较短,代表一个和数据库的链接,在B/S系统中一般不会超过一个请求;内部维护
一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。
SessionFactory是线程安全的,一个数据库对应一个sessionFactory,生命周期长,一般在整个系统生命周期内有效;
SessionFactory保存着和数据库连接的相关信息(User,password,url)和映射信息,以及hibernate运行时要用到的一些信息。

=========================================================================================================
    Session的内部缓存与批量更新
=========================================================================================================

flush时将一级缓存与数据库同步
大批处理
大量操作数可能造成内存溢出,解决办法如下:
1.清除session中的数据
for(int i = 0 ; i < 1000000; i++)
session.save(obj);
for( int i = 0 ; i < 1000000; i++ ){
 session.save(obj);
 if(i % 50 == 0){
  session.flush();
  session.clear();
 }
}

2.用StatelessSession接口:它不和一级缓存交互,也不触发任何事件、监听器、拦截器,通过该接口的操作
会立刻发送给数据库,与JDBC的功能一样。
StatelessSession s = sessionFactory.openStatelessSession();该接口的方法与Session类似。
3.Query.executeUpdaate()执行批量更新,会清除相关联的类二级缓存(sessionFactory.evict(class)),
也可能会造成级联,和乐观锁定出现问题。

=========================================================================================================
      HQL补充
=========================================================================================================
1.查询多个对象select art,user from Article art,User user where art.author.id=user.id and
art.id = :id 这种方式返回的是Object[0]:article,Object[1]:user。
2.分页query.setFirstResult,query.setMaxResults.查询记录总数query.iterate("select count(*) from Person").next();
3.批量更新query.executeUpdate()可能造成二级缓存有实效数据。

=========================================================================================================
      Criteria补充
=========================================================================================================
1.排序Criteria.addOrder(Order.desc(propertyName));
2.关联查询criteria.setFetchMode("propertyName",FetchMode.SELECT);与映射文件中关联关系的fetch作用一致。
3.投影Projections.rowCount.max(propertyName),avg,groupProperty...
4.分页Projections.rowCount,criteria.setMaxResults(),criteria.setFirstResult()
5.DetachedCriteria(session)方法创建(在其他层创建比如在Service中创建)然后用getExecutableCriteria(session)方法
创建Criteria对象来完成查询。
6.Example查询,Example.create(obj);criteria.add(example)。

=========================================================================================================
     N+1次查询和懒加载
=========================================================================================================
1.用Query.iterator可能会有N+1次查询。
2.懒加载时获取关联对象。
3.如果打开对查询的缓存即可使用list也可能有N+1此查询。
拦截器与事件
拦截器与事件都是hibernate的扩展机制,Interceptor接口是老的实现机制,现在改成事件监听机制;他们都是hibernate的回调
接口,hibernate在save,delete,uodate ...等会回调这些类。
SQL和命名查询
用Map代替Domain对象;将对象转化为XML。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值