学习:Hibernate框架学习笔记_Hibernate配置

  • 理解Hibernate配置文件的作用
  • 掌握Hibernate.cfg.xml文件
  • 理解映射文件的作用
  • 持久化类
  • 持久化类的三种状态

一、hibernate.cfg.xml配置文件的作用

  • hibernate框架是为了能在各种不同环境下工作而设计的,因此存在大量的配置参数。hibernate.properties配置样例中有各种配置选项
  • 另一个方法是在hibernate.cfg.xml文件中指定一套完整的配置。这个文件可以当成hibernate.properties的替代
  • 若两个文件同时存在,XML文件将覆盖属性文件的设置,即xml文件是hibernate的默认选择
  • xml配置文件启动hibernate
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Configuration实例被设计为启动期间对象,一旦SessionFactory创建完成,它就被丢弃了。

二、hibernate配置文件

2.1、JDBC属性

connection.driver_class:设置使用的jdbc驱动程序
connection.url:设置jdbc连接字符串
connection.username:设置数据库用户名
connection.password:设置数据库用户密码

2.2、其他属性

  • hibernate.dialect:一个hibernate Dialect类允许hibernate针对特定的关系数据库生成优化的sql,当为应用程序的数据库属性hibernate.dialect设置正确的org.hibernate.dialect.Dialect的子类,hibernate将为大量的JDBC属性使用合理的默认值
    SQLServer:org.hibernate.dialect.SQLServerDialect
    MySQL:org.hibernate.dialect.MySQLDialect
    Oracle:org.hibernate.dialect.OracleDialect
  • hibernate.show_sql:输出所有sql语句到控制台。ture|false
  • current_session_context_class:指定三种绘画的上下文相关特性,内置提供了jta | thread | managed 三种实现
  • hibernate.transaction.factory_class:事务管理,有两种,JDBC | JTA
    hibernate.cfg.xml示例
  • 
    <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>
            <mapping resource="com/it/hibernate/entity/Person.hbm.xml"/>
    
        </session-factory>
    </hibernate-configuration>

    三、实体映射文件

    对象和关系数据库之间的映射通常也是用一个XML文档来定义的。这个文件的作用是确定各个Java对象和数据库表/视图对应关系的映射关系(并指定与属性相对应的列信息)
    所使用的映射方式以Java类为核心。
    示例:

    <hibernate-mapping package="com.it.hibernate.entity">
        <class name="Person" table="person">
            <id name="pid" type="int" column="pid">
                <generator class="sequence">
                    <param name="sequence">se_per</param>
                </generator>
            </id>
            <property name="pname" type="string"  />
            <property name="pwd" type="string"></property>
    
    
    
        </class>
    </hibernate-mapping>
    

  • DocType:所有的XML映射都要定义示例中的DocType.
  • hibernate-mapping:映射定义的根元素。允许嵌套多个映射,但最好一个持久化类对应一个映射文件。
    使用class元素定义一个持久化类
    class元素的属性:
    name:持久化类的(或者接口)的java全限定名。如果这个属性不存在,hibernate将假定这是一个非POJO的实体映射。
    table:对应的数据库表名
    subselect:它将一个不可变(immutable)并且只读的实体映射到一个数据库的子查询中。它用于通过SQL语句建立一个视图代替一张基本表。
    class元素的子元素
    id:被映射的类必须定义对应数据库表主键字段,为每一个实例包含唯一的标识。
    <id>元素的属性:
    name:属性名
    column:主键字段的名字。
    type:标识hibernate类型的名字
    <generator>子元素是一个java类的名字,用来为该持久化类的实例生成唯一标识:用于为long、short或者int类型生成唯一标识,hibernate内置的部分生成器为:
    increment:用于为long、short或int类型生成唯一标识
    identity:对DB2、MySQL、MSSQLServer、Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long、short或者int类型的。
    native:根据底层数据库的能力选择identity、sequence中的一个
    assigned:让应用程序在save()之前为对象分配一个标识符,这是generator元素未指定时的默认生成策略。
    generator子元素示例:
  • //在oracle数据库中使用序列为记录生成自增id
    <id name="recordId" column="recordId" type="integer">
        <generator class="sequence">
            <param name="sequence">seq_id</param>
        </generator>
    </id>
    //要求:1、在数据库中已经建立名为"seq_id"的序列对象
    2、ID属性的数据类型必须为integer、short或long
    Hinernate在执行插入时,首先会查询seq_id的nextValue值,然后才会执行记录的插入操作。

    property:<property>元素为类定义了一个持久化的javabean风格的属性。

  • 映射类型:
    通过hibernate提供的类型映射可以将java语言中的数据类型映射到SQL数据库系统的数据类型,这些映射类型帮助将两种体系中在数据类型进行转换:
  • <property name="userPassword" column="userPassword" type="string"/>

    hibernate内置的映射类型:
    integer long short float double character bype boolean yes_no true_false:
    这些类型都对应java的原始类型或其封装类,来符合特定数据库厂商的SQL字段类型
    string:从jva.lang.String 到VARCHAR(或者Oracle的VARCHAR2)的映射
    date time timestamp :从java.util.Date和其子类到SQL类型DATE TIME 和TIMESTAMP (或等价类型)的映射
    calender calendar_date:从java.util.Calender到SQL类型 TIMESTAMP和DATE的映射
    big_deciaml big_integer:从BigDecimal和BigIntener到NUMERIC(或者Oracle的NUMBER类型)的映射
    text:把长jva字符串映射为SQL的CLOB或者TEXT类型

    四、持久化类

    在应用程序中,用来实现业务问题实体的类,且应遵循POJO(Plain Old Java Obeject)传统java对象。
    创建映射文件之前,应该创建一个持久化类。持久化类是指其实例需要被hibernate持久化到数据库中的类。持久化类通常是域模型中的实体域类。持久化类需符合javabean标准,包含一些属性,以及与之相对应的setter、getter方法,其中属性一般修饰为private,方法修饰为public。
    hibernate运用了java的反射机制,将调用java.lang.reflect.Constructor.newInstance()方法来构造持久化实例。所有持久化类必须提供一个不带参的默认构造方法。
    POJO对象:
    - 提供一个无参的构造方法。
    - 提供一个标识属性(推荐),这个属性映射数据库表的主键字段,这个属性命名、类型高度自由,可是任何原始类型、及其包装类等。
    - 如果要使用代理来获得优化性能的选择,必须使用非final的类
    - 为所有的持久化属性提供访问方法(getter、setter)
    持久化类的状态
    1、瞬时 Transient
    -由new操作符创建,且尚未与hibernate session关联的对象被认定为瞬时Transient的
    - 瞬时对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)
    - 如果程序中没有保持对瞬时对象的引用,它会被垃圾回收器(Garbage Collection)销毁
    - 使用hibernate session可以将其变为持久的状态(persistent)
    hibernate自动执行相应的sql
    2、持久 Persistent
    - 持久的实例在数据库中有对应的记录,并拥有一个持久化标识。
    - 持久的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义对象都仅在相关联的session生命周期内的保持这种状态。
    - hibernate会检测处于持久状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)
    - 开发者不需要手动执行update,将对象从持久状态变成瞬时状态也不需要手动执行delete语句。
    3、托管 Detached
    - 与持久对象关联的session被关闭后,对象就变为托管状态。
    - 对托管对象引用依然有效,对象可继续被修改
    - 托管对象如果重新关联到某个新的session上,会再次转变为持久的。期间的改动将被持久化到数据库中
    - 托管与持久相互的功能提供一种编程模型,即中间会给用户思考时间的长时间运行的操作单元的编程模型。我们称之为应用程序事务,即从用户观点看是一个操作单元(unit or work)
    生命周期状态转换:
    这里写图片描述
    将对象持久化
    hibernate认为持久化类通过new方法创建对象是处于瞬时状态的。我们可将瞬时对象与session关联,而将这个对象变为持久化状态。

    User user = new User();
    user.setName("zhang");
    user.setAge(10);
    ...
    session.save(user);

    加载(查询)持久化对象
    如果用户知道某个持久化对象的标识(主键值),就可以使用session的load()方法来从数据库中获取它,load()还有一个参数是指定类的class对象。这个方法会创建指定类的持久化实例,并从数据库加载其数据。
    如果不确定是否有匹配的行存在,应该使用get()方法,它会立刻访问数据库,如果没有对应的行,会返回null

    User user =(User)session.load(User.class,"param");

    修改持久化类
    -在同一个事务中的持久实例(通过一个session装载、保存、创建或者查询出的对象)被代码操作所造成的任何修改都会在(Session被刷新)flushed的时候被同步修改到数据库中。
    - 在同一个事务中的持久实例的修改不需要调用某个特定的方法对数据库进行更新。
    - 在一个事务中获取对象,然后将对象发送到界面层去操作,最后在一个新的事务保存所做的修改。这时,hibernate通过提供使用update()方法重新关联托管实例的方法来支持这种处理模式。
    - 在一个新session中通常第一个调用的是update方法,以便保证重新关联托管对象的操作首先被执行。

    删除持久化对象
    使用session.delete()会把对象的记录从数据库中移除。但是,应用程序中仍然有一个指向已删除对象的变量。所以,可以理解为,delete的用途是把一个持久化的对象变成瞬时对象。
    session.delete(user);
    注意:对持久化类的的操作(update,get,load,delete)等通常都需要根据在配置文件中声明的”id“属性,所以在执行相关操作之前要确定持久化类的标识属性是否被正确赋值。

    总结:
    编写hibernate.cfg.xml文件
    编写实体映射文件entiry.hbm.xml
    hibernate的数据映射类型

    猜你喜欢

    转载自blog.csdn.net/qq_35206244/article/details/81289381
    今日推荐