zoukankan      html  css  js  c++  java
  • hibernate中configuration和配置文件笔记

    • hibernate的核心类和接口
    1. Configuration类
      1.   作用:(1)读取hibernate.cfg.xml文件

                     (2)管理对象关系映射文件<mapping resource="">

                     (3)加载hibernate的驱动,例如:url,用户名

                     (4)管理hibernate配置信息

    2. hibernate.cfg.xml
    3. 对象关系映射文件
    4. SessionFactory(会话工厂)接口
      1. 缓存sql语句和某些数据(称为Session级缓存)
      2. 在应用程序初始化的时候创建,是一个重量级类(耗内存),一般使用单例模式保证一个应用中只需要一个SessionFactory实例
      3. 在如果某个应用访问多个数据库,则要创建多个会话工厂实例,一般是一个数据库一个会话工厂实例。
      4. 通过SessionFactory接口可以获得Session(会话)实例。
      5. 示意代码如下:
        1 1 Configuration cf = new Configuration().configure();
        2 2 SessionFactory sf = cf.buildSessionFactory();
        3 3 Session s = sf.getCurrentSession();//或者是:Session s = sf.openSession();

        注意:这里有关sf.getCurrentSession()和sf.oopenSession()的区别:openSession()是每次可以获取一个全新的session;getCurrentSession()获取的是和当前线程绑定的session,即:在同一个线程中我们获取的session是同一个session,这样的话可以利于事务的控制。如果是使用getCurrentSessionn(),需要再hibernate.cfg.xml文件中配置如下:

        1 <!--配置可以使用getCurrentSession-->
        2 <property name="hibernate.current_session_context_class">thread</property>

         在使用过程中openSession()和getCurrentSession()的选择原则:①如果需要在同一个线程中,保证使用同一个Session时,则使用getCurrentSession();②如果在一个线程中,需要使用不同的Session,则使用openSession();

    5. openSession()和getCurrentSession区别:
      1. 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession() 创建的session则不会
      2. 采用getCurrentSession()创建的session在commit或rollback时,会自动关闭,而采用openSession()创建的session必须手动关闭。
      3. 使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
        1 <!--如果使用的是本地事务(jdbc事务)配置可以使用getCurrentSession,-->
        2 <property name="hibernate.current_session_context_class">thread</property>
        3 <!-- 如果使用的是全局事务(jta事务)-->
        4 <properity name="hibernate.current_session_context_class">jta</properity>
    6. 如何查看session是否及时关闭
      1. windows:
        1. 在cmd命令中输入:netstat -an [oracle 1521/mysql 3306/sql server 1433]
      2. linux/unix:
        1. 在命令行中输入:netstat -an 或者top
    7. session接口的主要作用是:
      1. session一个实例代表与数据库的一次操作(一次操作可以使crud组合)
      2. session实例通过SessionFactory获取,用完及时关闭
      3. session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSession()获取
      4. session可以看做是持久化管理器,它是与持久化操作相关的接口
    8. Session(会话)接口的几个重要方法:
      1. 保存一个对象(记录)——save方法
      2. 删除一个对象(记录)——delete方法
      3. 查询一个对象(记录)——get/load方法
        1. get()和load()区别:
          1. get()方法直接返回实体类,如果查不到数据则返回null,load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),当代理对象被调用时,如果没有数据不存在,就会抛出org.hibernate.ObjectNoFoundException异常
          2. load先到缓存(session缓存/二级缓存)中取查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中去查询,这就是常说的load在默认情况下支持延迟加载(lazy)
          3. get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)。总之,如果确定DB中有这个对象就用load(),不确定就用get()(这样可以提高效率)。
      4. 修改一个对象(记录)——update方法

               

  • 相关阅读:
    java面试
    java多态
    java多线程
    Java操作ElasticSearch
    liunx安装jdk
    linux安装Elasticsearch详细步骤
    java IO流
    java递归
    File文件类
    redis单机多节点集群
  • 原文地址:https://www.cnblogs.com/lihuibin/p/8196051.html
Copyright © 2011-2022 走看看