hibernate初步学习(二)——hibernate配置文件学习

一、hibernate配置文件学习

Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种特性。
在之前的配置中,我们需要在src目录下添加Hibernate配置文件“,例如数据方言、连接字符串、用户名密码、驱动以及实体对象映射这里不再进行赘述。今天了解的是一些其他配置:

  <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>
        <session-factory name="foo">    
             <!-- 数据库方言 -->
            <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
            <!-- 数据库驱动 -->
            <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <!-- 数据库账号密码 -->
            <property name="hibernate.connection.username">scott</property>
            <property name="hibernate.connection.password">tiger</property>
            <!-- 数据库链接字符串 -->
            <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <!-- 数据库语句是否打印 -->
            <property name="show_sql">true</property>
            <!-- 会话上下文   线程绑定模式-->
            <property name="current_session_context_class">thread</property>
            <!-- 实体对象映射 -->
            <mapping resource="com/it/hibernate/entity/Person.hbm.xml"/>

        </session-factory>
    </hibernate-configuration>

1.会话上下文current_session_context_class
共有三种模式:jta|thread|managed三种默认为jta。
第一步:先加入配置语句:

 <property name="current_session_context_class">thread</property>

第二步:改变获取session的方法:

 public static Session getSession(){

            //线程绑定模式
            return sessionFactory.getCurrentSession();
        }

第三部:在对数据库的增删改查必须都在事物中:

  public boolean addPerson(Person person){

        Session session = HibernateUtil.getSession();
        Transaction tran = session.beginTransaction();
        int result = (int) session.save(person);

        boolean flag = false;
        if(result>0){
            flag = true;
            tran.commit();
        }
        //当采用线程绑定模式,当事务提交后自动关闭session
        //session.close();
        return flag;

    }
    public Person qeuryPerson(int pid){

            Session session = HibernateUtil.getSession();
            //线程绑定模式需要在事物
            Transaction tran = session.beginTransaction();
            Person person = (Person) session.get(Person.class, pid);
            return person;
        }

当使用ssh框架时,会将事物交由spring管理,一般使用thread模式。
2.事物管理 hibernat.transaction.factory.class
有两种jdbc|jta
暂时使用到这两种,后面再做增加

二、load与get区别

load() 称为懒加载,延迟加载,用到再进行加载。
get() 则是直接加载直接加载。

三、save与saveOrUpdate区别

save() 只进行存储操作
saveOrUpdate() 有更新则更新无更新则存储

四、实体映射的配置

例:Person.hbm.xml

     <?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="com.it.hibernate.entity">
        <!--class中name为java类的名称 ,table则为数据库中的表名  -->
        <class name="Person" table="person">
            <!--id为主键  type为主键类型  colum为字段名  -->
            <id name="pid" type="int" column="pid">
                <!-- 为id添加唯一标示  hibernate中部分生成器-->
                <generator class="sequence">
                <!-- 在oracle中使用序列生产自增id  此序列名为数据库中已建立的序列名-->
                    <param name="sequence">seq_person</param>
                </generator>
            </id>
            <property name="pname" type="string"  />
            <property name="pwd" type="string"></property>  
        </class>
          </hibernate-mapping>

这里将数据库表与java对象映射,标准是以java为核心。
generator标签中hibernate内置了一些生成器:
increment:用于为long,short,int生成唯一标识
identity:对db2,mysql,sql server的内置标识字段提供支持。
native:根据底层数据库的能力选择identity,sequence中的一个。
assigned:让应用程序在save()之前为对象分配一个标识符。
sequence:适用于orcle。

五、持久化类的状态

持久化类通常是域模型中的实体域类,并且符合javabean的标准。
hibernate运用的是java反射的思想。
1.瞬时-transient
由new操作创建,且尚未于hibernate session关联的对象就是瞬时的。
注意如果没有对瞬时对象进行使用,他将会被垃圾回收器销毁。
2.持久-persistent
持久的实例在数据库中由对应的记录,并拥有一个持久化标识。
它可能是刚被保存的,或刚被加载的,他都在仅在相关联的session生命周期内保持这种状态。
3.脱管
与持久对象关联的session被关闭后,对象就是脱管的。他可以被重新关联到session中。

六、数据库级分页

1.oracle数据库分页

      select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow

2.SQL Server 2005数据库分页

  Select * from (select 列名,row_number() over(order by 列名1) as 别名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow

3.MySQL数据库分页

    Select * from 表名 limit startrow,pagesize
    (Pagesize为每页显示的记录条数)

猜你喜欢

转载自blog.csdn.net/hqh1129/article/details/81321063