首页 > 代码库 > hibernate学习随记

hibernate学习随记

hibernate学习随记:

 

  一:hibernate的核心类和接口

①  Configuration 类

它的用处是:

  1. 读取hibernate.cfg.xml
  2. 管理对象关系映射文件 <mapping resource=””>
  3. 加载hibernate 的驱动,url ,用户..
  4. 管理hibernate配置信息

 

②  hibernate.cfg.xml

③  对象关系映射文件

④  SessionFactory (会话工厂)

  1. 可以缓存sql语句和数据(称为session级缓存)!!
  2. 是一个重量级的类,因此我们需要保证一个数据库,有一个SessionFactroy

                       

  二: 讨论一个通过SessionFactory 获取 Session的两个方法 openSession() 一个 getCurrentSession();

  1. openSession() 是获取一个新的session
  2. getCurrentSession () 获取和当前线程绑定的session,换言之,在同一个线程中,我们获取的session是同一session,这样可以利于事务控制

如果希望使用 getCurrentSession 需要配置 hibernate.cfg.xml中配置.

  1. 如何选择

原则:

      ①如果需要在同一线程中,保证使用同一个Session则,使用getCurrentSession()

      ②如果在一个线程中,需要使用不同的Session,则使用opentSession()

  1. 通过 getCurrentSession() 获取的session在事务提交后,会自动关闭,通过openSession()获取的session则必须手动关闭
  2. 如果是通过getCurrentSession() 获取 sesssion ,进行查询需要事务提交.

 

 

三:   如何确定你的session有没有及时关闭

 

windows  cmd  netstat –an      [oracle 1521 mysql 3306 sql server 1433]

linux/unix  netstat –anp  top 

 

⑤  session接口

它的主要功能和作用是:

  1. Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
  2. Session实例通过SessionFactory获取,用完需要关闭。
  3. Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSessiong()。
  4. Session可以看做是持久化管理器,它是与持久化操作相关的接口

 

//查询方法get vs load

    get vs load

  1. 如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException
  2. 使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)
  3. 通过修改配置文件,我们可以取消懒加载

<class  name="Employee" lazy="false" table="employee">

  1. 如何选择使用哪个: 如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)

hibernate学习随记