读书人

二十二 Hibernate照射文件配置

发布时间: 2012-12-24 10:43:14 作者: rapoo

二十二 Hibernate映射文件配置

id 主键生成方式increment Hibernate内部自己做累加,而不是数据库中做累加。indentity 数据库标示符自增长squence Oracle常用hilo 高低位 数据库保存高位字段,Hibernate累加地位字段,新插入数据由这两个字段组成,不会重复。uuid 生成主键不用访问数据库,Hibernate生成,插入效率很高,主键string类型,查询时候效率不高。native 根据数据库底层能力选择identity squence hiloassigned 手工分配主键select 通过底层触发器生成foreigh 外键引用作为主键property属性节点update 是否允许修改列值,比如用户名可以设为不可修改insert 是否允许插入列值formula 计算列表达式定义,列在数据库表中是没有的。lazy 懒加载,列的懒加载。unique 是否唯一not-null 是否允许空index 索引名unique-key 多列唯一,多列的unique-key值设为一样即可length 长度prescision 精度Session是非线程安全的,生命周期较短,代表一个和数据库的链接,在bs系统内一般不会超过一个请求内部维护以及缓存和数据库连接,如果session长时间打开会长时间占用内存和数据库的链接。SessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长一般在整个系统生命周期内有效;SessionFactory保存着和数据库连接的相关信息和映射信息,以及Hibernate云心事要用到的一些信息。 session内部缓存管理与批量更新session.flush()方法强迫一级缓存和数据库进行同步,如果主键生成方式不是native这类数据库生成的,那么Hibernate的sql语句在事务提交或者查询操作之前操作,将与数据库的通信延后,不要频繁的进行操作。如果调用了flush方法,那么就立即进行与数据库的通信。那么在处理大批量数据插入的时候,会产生内存溢出的情况,因为数据库的通信并不是在一条记录插入后,而是在事务提交或者事务内部第一次查询的时候,那么一般来说,我们就只能插入20条更新一下数据库的方法。 view plaincopy to clipboardprint?01.for(int i=0;i<10000;i++){   02.    s.save(user);   03.    if(i%20 == 0){   04.        s.flush();   05.        s.clear();   06.    }   07.}  for(int i=0;i<10000;i++){    s.save(user);    if(i%20 == 0){        s.flush();        s.clear();    }} 需要及时的提交数据库更新操作和清空缓存。也可以使用StatelessSession 无状态的session,即不使用缓存。使用方式和session一样。在处理大批量更新的时候,Hibernate3.0以前只能一条一条更新,在3.0以后可以使用批量更新的hql语句view plaincopy to clipboardprint?01.Query query = session.createQuery("update u set birthday = :bd from User as u");   02.query.executeUpdate();  Query query = session.createQuery("update u set birthday = :bd from User as u");query.executeUpdate(); 但是这种批量更新的方式会清空一级缓存而二级缓存,而且在关联的版本号上可能由些问题。hql与criteria查询方式补充查询多个对象select art,user from Article art,User user where art.author.id = user.id and art.id = :id这种方式返回的是Object[],Objectp[0]:article,Object[1]:user。查询的时候尽量使用get方法,因为get方法会从缓存里找数据,而缺省情况下hql语句是不会将查询结果放入缓存的。DetachedCriteria离线查询,处理动态查询。 view plaincopy to clipboardprint?01.static List dc(DetachedCriteria dc){   02.    Session s = HibernateUtil.getSession();   03.    Criteria c = dc.getExecutableCriteria)s_;   04.    List rs = c.list();   05.    s.close();   06.    return rs;   07.}  static List dc(DetachedCriteria dc){    Session s = HibernateUtil.getSession();    Criteria c = dc.getExecutableCriteria)s_;    List rs = c.list();    s.close();    return rs;} 调用语句view plaincopy to clipboardprint?01.DetachedCriteria dc = DetachedCriteria.forClass(User.class);   02.String name = request.getParameter("name");   03.if(name != null){   04.    dc.add(Restrictions.eq("name",name));   05.}   06.List users = dc(dc);  DetachedCriteria dc = DetachedCriteria.forClass(User.class);String name = request.getParameter("name");if(name != null){    dc.add(Restrictions.eq("name",name));}List users = dc(dc); 就可以完成一个动态添加查询条件的Criteria。完毕 end!

?

读书人网 >编程

热点推荐