• Hibernate入门3.配置映射文件深入


    Hibernate入门3.配置映射文件深入 2013.11.27

    前言:

             之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题,比如日志输出、slf4j对应的版本等等。其实官方网站下载的hibernate和Spring也是不可靠的,因为这些报的运行也需要其他的包的支持。所以及时自己在IED编辑的时候,没有出现“红线”不一定代表就会正确的编译运行。如果程序运行的时候缺少包的话,一定要养成习惯去对应的官方网站下载,有时候对应的版本也十分重要。

             这一节继续深入的学习Hibernate的配置文件和ORM映射文件

    1.Hibernate配置文件

             对于配置文件的方式:hibernate.properties方式、hibernate.cfg.xml方式和两者结合使用。

             常用的配置属性:

             hibernate.dialect: 针对不同的数据库提供不同的方言类,允许hibernate针对特定的数据库生成优化的SQL语句。

             hibernate.connection.driver_class:

             hibernate.connection.url

             hibernate.connection.username

             hibernate.connection.password

             hibernate.connection.pool_size

             hibernate.connection.datasource//数据源的JNDI名字

             hibernate.show_sql:是否输出Hibernate操作数据库的时候执行的sql

             hibernate.format_sql:是否格式化的输出sql语句

             hibernate.hbm2ddl.auto: 自顶向下,从持久化类导数据库的操作,有几个选择的值:create(每一次都会重新生成表),create-drop(创建之后,当sessionFactory关闭的时候,就会自动删除),update,validate(只是比较,不会创建表)

             需要解释的是hibernate.dialect:

             不同的数据库对应不同的方言类:

             DB2                   org.hibernate.dialect.DB2Dialect

             SQL server        org.hibernate.dialect.SQLServerDialect

             MySQL               org.hibernate.dialect.MySQLDialect

             Oracle9i            org.hibernate.dialect.Oracle9iDialect

             Sybase               org.hibernate.dialect.SybaseDialect

            

             对于使用properties方式配置的,这里是没有ORM Mapper的配置信息,所以需要使用configuration.addResource(“com.yang.model.mapper…”)一个一个的加载,其中hibernate.properties配置文件必须在根目录下面。

             当然两者是可以联合使用的。

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>

        <session-factory>

            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test??useUnicode=true&amp;characterEncoding=utf8</property>

            <property name="hibernate.connection.username">root</property>

            <property name="hibernate.connection.password">221256</property>

            <property name="hibernate.show_sql">true</property>

            <property name="hibernate.hbm2ddl.auto">update</property>

            <!--

                <property name="hibernate.format_sql">true</property>

             -->

            <!-- 注册所有的ORM映射文件 -->

            <mapping resource="com/yang/model/mapper/User.hbm.xml"/>

           

        </session-factory>

     

    </hibernate-configuration>

    2.Hibernate映射文件

             映射文件的根元素是<hibernate-mapping>该元素之下,可以有很多class元素,每一个class元素对应一个持久化类的映射。

             映射文件的结构如下:

    <hiberbate-mapping  属性=”值”>

             <class name=”PackageName.ClassName” table=”tableName”>

                       <id name=”主键名” column=”主键列”>

                                <generator class=”生成策略”/>

                       </id>

                       <!—属性列表-->

                       <property name=”userName” column=”columnName” type=”数据类型”/>

             </class>

    </hibernate-mapping>

             其中<hibernate-mapping>元素的可选属性如下:

             schema: 指定映射数据库的schema名

             catalog:指定数据库的Catalog名字

             default-cascade: 设置hibernate的默认级联风格,默认是none

             default-access:设置默认属性的访问策略,默认是property

             default-lazy:设置默认的延迟加载策略,默认是true

             auto-import:是否允许使用非全限定的类名,默认是ture

             package:指定一个包,对于映射文件中非全限定的类名,默认在该包下

             而class的元素常见的属性有:

             name: 持久化类名

             table:持久化类映射表名

             discriminator-value:区分不同子类的值

             mutable:指定的持久化了的实例是否可变,默认是true

             proxy:延迟装载的代理,可以是该类自己的名字

             主键生成器

             Hibernate映射文件中的<id>元素定义了持久化类的标识符属性(主键),其generator子元素则用来设置当前持久化类的标识符属性的生成策略。在hibernate中内置了很多的主键生成器

             increment: 获取数据库中的主键最大值,然后加1

             identity:自动增长。 MySQL SQL Server 等可以设置表的都一个字段是自动增长的,此种方式生成主键的数据类型可以是long short int和对应的封装类的类型

             sequence:序列,数据库中如Oracle DB2中可以创建一个序列,然后从序列中获取当前序列号作为主键值。

             还有hilo, seqhilo, uuid, guid, native, assigned, foreign等等多种方法。在MYSQL中推荐使用identity或者是native。如果使用分布式部署数据库的话,推荐使用uuid,也就是采用128位的UUID算法生成一个字符穿类型的主键。

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>

        <class name="com.yang.model.User" table="user">

            <id name="id" column="id">

                <generator class="native"/>

            </id>

            <property name="userName" column="username" type="string" not-null="true"/>

            <property name="password" column="password" type="string" not-null="true"/>

        </class>

    </hibernate-mapping>

    3.持久化对象

             Hibernate持久化对象的几个状态:

             瞬时状态:对象使用new关键字创建,尚未与Hibernate的Session关联,此时的对象处于瞬时状态(Transient)瞬时状态的对象时不会保存到数据库的,也不会赋予持久化标注,如果程序中失去了瞬时状态对象的引用,那么他也会被垃圾回收机制回收

             持久化状态(Persistent):它和数据库表中的一条记录相对应,并且有一个持久化的标识。持久化对象时可以刚刚爆保存的或者是刚被加载的。持久化状态的对象必须和指定的Session关联,他的改动Hibernate都会检测到,并且在Session关闭或者Transaction提交的同时更新数据库中对应的数据,开发者不需要手动执行UPDATE

             托管状态(Detached):曾经处于持久化状态,与之关联的Session被关闭,对象就会被托管了。

             改变持久化对象的方法:使用Session中的接口方法对持久化对象状态产生的影响:

             save():保存持久化对象,在数据库中新增加一条数据

             saveOrUpdate()保存或者是更新,该方法根据id标签的unsaved-value属性值决定执行新增加一条记录或者是更新。

             get()根据标识符属性获得一个持久化对象,如果未找到,则返回null 

             load()该方法根据标识符属性加在一个持久化对象,如果未找到,则抛出异常

             update() 该方法对托管状态的对象重新完成持久化,更新数据库中的数据

             delete()删除数据库中的一条记录,不过需要先使用get() or  load() 获取持久化对象

             close()关闭当前的session对象,并且清空该对象中的数据

             evict()用于清除session缓存中的某一个对象

             clear()清除Session中的所有缓存对象。

    YangTengfei

    2013.11.28

  • 相关阅读:
    转:上传图片到服务器文件佳
    RowDataBound 事件的巧妙运用
    对查询数据库中第M到N条记录的思考1
    mysql导入表
    vim向上查找
    stackoverflow太好用了
    【原创翻译】理解python的with语句
    转 Python 实例方法、@staticmethod和@classmethod
    我真的渴望成为一名技术牛人
    今天的囧事,一定要熟练使用git。。
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3473205.html
Copyright © 2020-2023  润新知