day01(1-5)

一、开发入门
1.为什么引入Hibernate:主要是因为模式不匹配(关系->对象)
2.主流ORM框架有Hibernate,toplink,OJB
3.Hibernate框架的使用:
 a.我们为每一个JAVABEAN建立一个mapping文件(xxx.hbm.xml),放在和类同目录。然后为Hibernate新建一个配置文件(Hibernate.cfg.xml)。
 b.初始化Hibernate:
  Configuration cfg = new Configuration();
  cfg.configure();
  SessionFactory sef = cfg.buildSessionFactory();
  Session s = sef.openSession();
  Transaction tx = s.beginTransaction();
  ........
  tx.commit();
  s.close();
4.Hibernate的配置文件中,通常是数据库的URL信息和数据库驱动信息以及方言信息。
5.要想将JAVABEAN交给Hibernate进行映射,必须将其在Hibernate的配置文件中通过<mapping resource="映射文件的相对路径"/>来引用
6.我们可以通过<property name="hbm2ddl.auto">XXX</property>来设置Hibernate是否自动创建表,可选方式:create-drop,create,update,validate-->将数据库结构与映射文件进行比较
 如果结构发生变化,则报错,用于实际部署中
7.我们可以通过show create table xxx来显示表的结构信息,通过show engines显示数据库的引擎信息.
二、入门案例的细节分析
1.使用Hibernate进行开发的流程
 a.Domain Object->mapping->db(官方)
 b.db开始,通过工具生成mapping和domain object(使用较多)
2.映射到数据库的JAVABEAN的一些限制:
 a.默认的构造方法(这是因为Tomcat创建JAVABEAN对象的时候,通过反射技术来实现的,反射时需要默认的构造方法)
 b.有主键(可选)
 c.非final的,否则对懒加载有影响(可选)
3.简单认识映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.auction">-->JAVABEAN所在的包名
 <class name="User" table="AuctionUser" lazy="true">-->JAVABEAN的类名
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="email"/>
 </class>
</hibernate-mapping>
三、入门案例的优化
1.为了提高代码的重用性,我们把Hibernate初始化相关的工作封装到一个工具类中:
 public final class HibernateUtil{
  private HibernateUtil(){}
  private static sessionFactory;
  static{
   Configuration cfg  = new Configuration();
   cfg.configure();
   sessionFactory = cfg.buildSessionFactory();
  }
  public static SessionFactory getSessionFactory(){
    return sessionFactory;
  }
  public static Session getSession(){
    return sessionFactory.openSession();
  }
 }
2.使用上述工具类的模版代码:
 public void save(Object entity){
  Session session = null;
  Transaction tx = null;
  try{
   session = HibernateUtil.getSession();
   tx = session.beginTransaction();
   session.save(entity);
   tx.commit();
  }finally{
   if(session!=null)
    session.close();
  } 
 }
四、初步认识Session接口
1.Session的几个主要方法:
 a.save,persist方法,用来保存数据,在开启事务的情况下,两者相同,若不开启事务,则save方法会先插入,然后回滚,而persist则不会产生插入动作
 b.update,merge方法,更新对象,前者如果数据库中没有对应的的记录,则会出现异常,后者更新的对象一般处于托管状态
 c.get方法,根据ID立刻查询数据库
 d.load方法,根据ID下一次查询数据库(懒加载)
 e.saveorupdate方法,根据对象的状态来确定调用save还是update
 f.lock方法,从数据库中将对象查找出来,并将该对象加锁。
2.认识一下懒加载(查询一般不需要事务)
 User user = (User)session.load(user.class,id);//Hibernate会新建一个对象,该对象继承自User,将该对象的引用赋给user
 Sysout(user.getName());//第二次调用的时候,Hibernate才会查询数据库,将user对象设置值
五、Hibernate中对象的三种状态
1.三种状态(主要判断数据库中是否有该对象的记录,Session是否已经关闭)
 a.瞬时的:数据库中没记录,和session也没有关联
 b.持久的:数据库中有记录,和session有关联,并且事务没有提交。处于持久状态的对象,如果发生改变,则会更新到数据库,并且将更新延迟到事务提交的时刻(多个update只会更新最后一个)
 c.托管的(游离的):数据库中有记录,但是和session没有关联
2.Hibernate如何判断一个对象是瞬时的还是托管的?
 答:有两个标准,一、判断该对象的ID值是否为0,或者为空。如果在mapping文件的<id>节点中设置了unsavedvalue,那么如果对象的ID值和
 unsavedvalue值相同,那么该对象就是瞬时的二、判断该对象的version值
3.三种状态的转换
  

posted @ 2012-06-03 21:50  xiao秋  阅读(406)  评论(0编辑  收藏  举报