Hibernate学习笔记

相关文档: 
 Hibernate
参考文档  v3.0.2    
 http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/

  Hibernate
实践.pdf


 ● 笔记

  
·SessionFactory是数据库编译后的内存映像,多个数据源则需要使用多个SessionFactory。持久化对象(PO)=JavaBean+映射配置文件。所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。
  ·
使用Hibernate的开发者应该总是关注对象的状态(state),不必考虑SQL语句的执行。 这部分细节已经由Hibernate掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。

  ·Hibernate的操作
    The main function of the
Session is to offer create, read and delete operations for instances of mapped entity classes. Instances may exist in one of three states:

transient: never persistent, not associated with any
Session
persistent: associated with a unique
Session
detached: previously persistent, not associated with any
Session

Transient instances may be made persistent by calling
save(), persist() or saveOrUpdate(). Persistent instances may be made transient by calling delete(). Any instance returned by a get() or load() method is persistent. Detached instances may be made persistent by calling update(), saveOrUpdate(), lock() or replicate(). The state of a transient or detached instance may also be made persistent as a new persistent instance by calling merge().

save() and persist() result in an SQL INSERT, delete() in an SQL DELETE and update() or merge() in an SQL UPDATE. Changes to persistent instances are detected at flush time and also result in an SQL UPDATE. saveOrUpdate() and replicate() result in either an INSERT or an UPDATE.

    session.save()/session.persist()        //Persist the given transient instance

    session.createQuery()            HQL
查询
    session.createCriteria()          
根据实体的条件查询
    session.createSQLQuery()       
原生的SQL查询 
           
    session.get()/session.load()    
根据某个实例的持久化标识(id),来装载对象。当不存在指定的对象时候,前者返回null,后者抛出异常。
    sess.delete(cat);    //
delete()的用途是把一个持久实例变成瞬时(transient)
  
    
例如:
    
session.createCriteria()  
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();
//Criterion
代表查询条件,由Restrictions类来产生。

 ·Session刷出(flush)
每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为刷出(flush),默认会在下面的时间点执行:

   

  • 在某些查询执行之前
  • 在调用org.hibernate.Transaction.commit()的时候
  • 在调用Session.flush()的时候




·同一个类的多次映射
   
对特定的持久化类,映射多次是允许的。这种情形下,你必须指定entity name来区别不同映射实体的对象实例。(默认情况下,实体名字和类名是相同的。)

·分页
   Hibernate
的分页比较简单,
   Query q = sess.createQuery("from DomesticCat cat");
q.setFirstResult(20);
q.setMaxResults(10);
List cats = q.list();

//
另外,Hibernate还支持可滚动遍历(Scrollable iteration)


·批量处理
    
对于批量处理,需要设置hibernate.jdbc.batch_size 属性(例如=20,同时需要再一定间隔进行session的释放内存。例如
   session.flush();
session.clear();


 ·Hibernate的的实体映射
    
1-N,或者N-N的关系时候,当然就要使用到集合类型(例如bag,list,set等)。而当N-1,或者1-1的时候则不需要使用到集合类型。
    
N-N的关系时候,当然要用到连接表。

 ·Hibernate的事件框架由以下两部分组成
    
拦截器机制:实现Interceptor接口
    
事件监听器:实现LoadEventListener,SaveEventListener等。

 ·
LightWeight J2EE》这本书的第四章Hibernate中关于SQL的例子很好说明了实体的映射关系,代码见附件SQL08-02-01_22.rar

·HQL
    HQL中可以是用new操作符,参见: HQL获取部分的实体对象属性


 ·占位符的查询
    HQL
的方式:
    from User u where u.name=:username and u.yearold=:yearold
这就是一个常见的简单值的占位符式的查询,通过这样的方式就可以把值注入到
参数中:
query.setParameter(“username”,”bluedavy”);
query.setParameter(“yearold”,25)

    SQL的方式:
    from User u where u.name=? and u.yearold=?
query.setParameter(0,”bluedavy”);
query.setParameter(1,25);

    SQL查询进行实体映射时,应该尽量用占位符{}
    sess.createSQLQuery("SELECT {cat.*}, {mother.*}  FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
 .addEntity("cat", Cat.class)
 .addEntity("mother", Cat.class)


 ·Hibernate之前的很多ORM产品不能像SQL一样只获取需要的东西。所以要合理设置相关属性(Property或者集合或者映射等)LazyLoad,Hibernate3默认LazyLoad的属性值就是true。只有调用到相关属性时才会从缓存或数据库中加载。当然,集合也是同样如此。

 ·
inverse="true" 设置的谨慎
   User
Rolen-n单向关联,如果设置了inverse="true".则当保存UserRole时,不会保存相应的连接表
   (?)
是不是n-n双向关联的时候,才需要设置该值?

 

 · hibernate对实体的操作是需要跟事务关联,如果没有执行事务的commit(),则不会将其持久化到数据库中。

 

 ·hibernatespring集成时,将DAO类继承自HibernateDaoSupport,然后通过getHibernateTemplate()方法来实现CRUD操作则不需要直接管理session和事务。


 

你可能感兴趣的:(spring,sql,Hibernate,jdbc,C#)